Monthly Archives: 一月 2014

岁末年初[2014]

用岁末年初描述现在最好不过,2014年的一月即将过完,阴历的春节也即将开始,我想这才是真正的岁末年初吧。

泡上一杯茶,慢慢回味2013这一年。
回头看了一下去年给自己定的技术学习计划,不禁的笑出声来,罗列了整整29个技术点的学习目标。看着那么多目标,我依然能会想起当初斗志昂扬热血慢慢的自己。虽然很多目标都没有实现,不过让自己明白了,生活要有目标的同时还有要控制目标的数量,写了这么多年的程序,不知觉竟然把自己当成了程序,忽略了计划赶不上变化。

上半年在纠结中第一次辞职了,并离开了工作生活了3年的杭州,带着好奇与新鲜感来到了魔都–上海。离开了承载美好爱情期望的西湖,离开了碧绿青葱的飞来峰,离开了香烛缭绕的灵隐寺,直到真正离开杭州的那一刻才想起当初想要走遍杭州美景的豪言却是再也无法实现了。

那正是炎热的夏天来临之前,似乎大多的记忆中的场景大多在夏天,下半年在上海,也在是在新公司开始忙碌着适应新环境新工作。初来外企,感觉自己就像个婴儿一样,所有的都需要去学习是适应,犹记得第一次参加项目会议,看着一群陌生的面孔,看着PPT上陌生的单词没有来的紧张了一下。曾经有想过自己要进外企工作,因为总想跟外国人接触并学习,没想到竟真的实现了,当初收到HP公司的工作offer时,我高兴的给家里,朋友们打电话告诉他们,高兴的无以言表。接下来的日子,就是整天与技术打交道了,既然是外企自然英语是很重要,因为自己英语水平还是不高,所以还是有点吃力的,我只能坚持与努力学习。

记忆最深刻的是在HP第一次加班,外国人做事是很讲究一个时间性的,当时为了在规定时间内完成项目任务,我们整个team一直加班到凌晨,有人说外企应该很轻松,总体上来看似乎是这样的,弹性的工作时间,规范的工作流程。不过每个项目也总有闲也有忙的时候。到现在我依然记得凌晨回家时,一个人静静的回家途中的路灯。 也让自己明悟到,前进的路上总是很心酸的。
1ebba825f7734f4f916db85ef7fa2e5d

这一年离开了杭州到上海,离开了朋友,也让自己开始学会面对孤独,自己也过孤独的无奈,深夜的失眠, 凌晨路灯下安静的独坐,仰望天壁,那是真的感觉苦闷到无助,还好一直坚信努力的未来是美好。经历过独自面对空白的时光后,也让自己变得更加坚韧,也学会了思考生活。直面孤独,是对心灵的考验,这是我在经历过后的感悟。也让自己变得更加坚强,也更加珍惜生活。
这一年学到了很多新技术,并开始检视自己,发现了自己身上的傲慢与偏见,明白了人外有人天外有天。
这一年IPad, IPhone 都买了,虽然IPhone丢了,肉疼但不心疼,外企HP我也进来了。

洋洋洒洒写下来,感觉自己写的像流水账,也暗叹自己文采有限,脑海中的心酸实在不想写出来,有种千言万感却无从而抒的抑郁之感,着实无奈。算了,就按照自己的想法来写吧,下面认真总结下一自己:
1.细想这一年来,自己还是有点浮躁,有点急躁,这的确导致自己反了好几次错误。
2.因为急躁,有的时候做事情反而没有思考全面,这样的后果就是,事后想起来,就不得不将之前的事情反工。
3.在外企,英语十分重要,有好几次因为没有理解需求而导致任务失败。
4.有必要加强自己的编程思维,至于什么是编程思维,我的理解是,接到任务要理解清楚需求然后反复思考出现的情况,如此才能完成任务。

自己也在不知不觉间变得缄默起来,下半年qq空间,微信,微博不在关心了有空都泡在了博客园,尤其是后期,开始专心的捣鼓博客,不在发布乱七八糟的心情,给朋友打的电话也少了,喜欢一个人逛公园,宅家听音乐了。可能也正因为自己安静下来了,对生活的感悟也就多了起来了,不会再像以前,心里存不住话,有点感悟就像告诉全世界的冲动了,喜欢静静的自己去品味了。
年末了,不论今年如何都要为明年准备,这一年的经验成为下一年积累,我知道,我在成长,不会放弃。

我所理解的MVC和MVP浅析

这两天看一下MVP模式,与MVC模式很相似,但是2这之间却有不同,也来谈谈自己的一些理解。

关于MVC,讨论比较多就是生命周期,MVC内部结构以及MVC3个层之间的关系。
MVC的页面生命周期不同于asp.net页面的生命周期,把asp.net页面的生命周期比作是火车路线的话,那么事件就是这条线上的每一站。而MVC的感觉更像是超人变身的过程,每到一阶段都有特定组装(get Controller,Find Action 的过程),最终变身成功返回页面到客户端。这里有一篇关于MVC生命周期的好文章:Asp.net MVC生命周期

关于MVC的框架结构自己也在学习,推荐看蒋金楠的,自己也在看,里面讲的很细致,一次http请求过来,根据url如何找到controller,如何找到action,如何定位view讲解的非常详细,不过看之前需要一定的MVC基础,毕竟不是入门教材。

mvc
我所理解的MVC是
M: 所谓得Model
这个Model可能是数据库某个表的单个实体,也可以是集合,说白了就是页面要显示的数据,这个数据就是Model,因为View页面上只能访问到一个model变量。 而这个model不一定就对应数据库某个表的单个实体,一般习惯将数据库一个实体或者集合根据实际页面上需要显示的内容,创建一个ViewModel供View使用。比如说产品详细页,一般页面上要显示产片的所有详细信息,以及图片,可能还有加上部分会员信息,此时就可以创建一个ProductViewModel来包含页面必须要的显示信息,毕竟一个ProductViewModel总比同时传递一个Product以及User对象给View要好处理吧。 这个ProductViewModel就承担了一个将数据实体转换为页面实际用到的Model的作用。

V:就是视图
就是眼前能看到的页面,MVC模式有一个好处就是View可以在不改变 Controller以及Model的情况产生新的View,这就提供了多种页面展现形式。

C:控制层。
MVC中用于控制逻辑以及数据交互的重要组成部分。也是Model跟View之间重要的纽带。所有的请求都要经过Controller,根据实际情况想Model层获取数据并对应到具体的Action将数据返回个View.

新的模式:MVP Model-View-Presenter (模型-视图-提供器)。
MVP是有MVC演变来的,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
MVP之间的关系如图:
mvp
这里的View只负责展示界面,View不知道展示的数据是什么,View和Presenter之间通过接口通信,View实现接口所必要的方法或者事件,其余的全部交给Presenter,由Presenter跟Model交互。

MVP的优点
1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

MVP的缺点:
增加了Prsenter的的负担。毕竟承担了所有逻辑以及控制。

为了更清晰的理解MVP, 蒋金楠的blog有一篇非常详细的文章:谈谈关于MVP模式中V-P交互问题
下图是我根据文章中的代码转换成了类图并分了层次:
MVP图解

说明:
1.部分类名做了调整。
2.右下角灰色部分为本人自己增加的部分,个人认为实际项目中需要增加的结构。

参考资料:
1.百度百科
2.尝试MVP模式

首发地址:http://www.yuanxj.net/2014/01/mvp/

MVC学习笔记(1)

该笔记是在学习MVC时,边看书边记下来的,对学习过程遇到一些概念和关键字有简单描述,从而了解到MVC大体的知识点,若要深入还需要进一步学习。

页面
1. ViewData 只存在与当前的HTTP请求中,跟Session不一样,不会将数据带到下一个HTTP请求。
2. TempData 类似于ViewData 却又不一样,基类:TempDataDictionary ;内部使用Session来存储数据, 生命周期为,一次请求
a) 备注:Return RedirectxxxxxResult 类时,TempData会强制保留, 若当前请求读取了数据,则当次请求中TempData的数据将会被清除. 否则保留到下一个页面.
3. MVC 通过 模型绑定(Model Binding)机制解析客户端传递过来的数据。 DefaultModelBinder 类
a) 简单模型绑定 Action参数名称 与HTML页面input标签 name一致时,自动绑定
b) FormCollection类 可以获取整个窗口传送过来的数据
c) 复杂模型 Action参数为自定义类型
4. 处理模型绑定时,会进行数据验证,验证失败 Controller的ModelState.IsValid 值为false
a) Html.ValidationMessageFor() 用来显示错误消息
b) 若使用验证,需要使用<% Using(Html.BeginForm() ) %>
c) ModelState.AddModelError() 用于输出自定义消息
5. Bind特性,可以限制Model要绑定的字段;可以应用于参数,也可以应用于model类上
6. TryUpdateModel(),UpdateModel() 可以再次执行模型绑定,目的是,对有些不显示的字段跳过验证。

7. 动作过滤器
a) 顺序: 授权 Authorization Filter ,动作 Action , 结果 Result , 异常 Exception,
b) 过滤器一律使用 Attribute的方式应用在Action之上
c) 也可以用在Controller中,表示应用在了Controller中所有的Action
d) Web.config 中的system.web类,的Authentication 下的 loginurl属性,可以设定当权限不足时,应该跳转的页面
授权过滤
8. Html.RenderAction() 可以在view中发出另一个子请求(Sub-request) 并在执行一次mvc流程,执行完毕后将HTML返回的 到View
a) ChildActionOnly特性 标示 不会被其他Http请求执行
9. RequireHttps特性
10. ValidateInput特性 关闭输入验证机制
11. ValidateAntiForgeryToken特性 为了预防跨站请求伪造的发生
a) View中使用 <%: Html.AntiForgeryToken() %>
b) Controller中的Action上 [ValidateAntiForgeryToken]

动作过滤特性
12. IActionFilter接口 OnActionExecuting , OnActionExecuted.
13. AsyncTimeout 特性
14. NoAsyncTimeout 特性
a) 以上2个特性,需要Controller继承自:AsyncController类

结果过滤特性
15. IResultFilter , OnResultExecuting , OnResultExecuted.
16. 实现输出缓存机制 [OutputCache]

异常过滤特性
17. IExceptionFilter, OnException()
18. 执行过程发生任何异常时,都会通过WebFormViewEngine类,寻找名为Error的视图.

VIEW相关技术
19. 2中从ACTION中获取数据方式:
a) 弱类型获取 页面继承自ViewPage
i. 转换对象时,记得引入命名空间
b) 强类型获取
HTML辅助方法
20. 生成页面元素方法

模拟HTTP动词
21. DELETE 动词 利用Http.HttpMethodoverride()

Dynamic Data对mvc的支持
23. 强类型视图下 <% Html.EnableClientValidation();%> <% Html.BeginForm() %> <%:Html.EditorForModel()%> 会自动生成对 强类型对象的编辑以及验证
URL辅助方法
24. Url.Action() –生成操作方法的完全限定 URL
25. Url.Encode() –将 URL 字符串中的特殊字符编码为字符实体等效项
26. Url.Content() –将虚拟(相对)路径转换为应用程序绝对路径。
27. Url.RouteUrl() –基于当前的路由系统,生成一个完全限定 URL

Ajax方法
28. 需要加载 MicrosoftAjax.js 以及 MicrosoftMvcAjax.js
29. Ajax.ActionLink()
30. Ajax.BeginForm()
31. 默认是Post方式

自定义HTML方法
32. 扩展方法:静态类,静态方法,第一个参数为(this HtmlHelper helper,……..)
TagBuilder类
33. 可以轻松快速的创建自定义HTML 方法。包含用于创建 HTML 元素的类和属性。
MasterPage模板
34. 继承自system.web.mvc.viewMasterPage

部分视图
35. /shared/目录下
36. 建立部分视图(.ascx)
37. 不需要建立相对应的ACTION ,因为仅仅是HTML片段
38. 页面中加载方式: <%Html.RenderPartial(“Name”); %>
39. 多个部分视图,共享ViewData,TempData 以及Model
40. 可使用JS 来加载部分视图, js 通过url.action(“block Name”) 调用Controller的Action方法,该方法返回 Partialview();
41. 也可以使用HtmlRenderAction() 该方法会对IIS再进行一次处理例程要求(通过Server.Execute()方法) ,因此该方法会重新执行Controller的执行过程。

Area的相关技术
42. 在同一个项目中切割出不同的mvc 网站
43. MapRout() 增加最末位参数为命名空间
44. 视图页面, 增加 area = “areaName”
45. 解决多人开发冲突,controller命名冲突

Entity Framework code first学习笔记

在博客园里找到很多关于EF的学习资源,大部分都是跟Code First 相关,下面就自己学习到的知识总结一下,做个笔记以后随时翻开看看也不错。

我自己在练习时的环境为.net 4.0 , EF 4.0, VS2012,练习的目的在于使用,而非研究新特性。

涉及到的程序集:
1. EntityFramework.dll — 使用EF必须要加载的程序集

2. System.Data.Entity.dll –这个也是必须程序集,里面包含DbContext ,以及使用Fluent API方式约束表时用到的必要的命名空间.

涉及到的命名空间:
1. System.Data.Entity –包含提供对实体框架的核心功能的访问的类
2. System.ComponentModel.DataAnnotations.Schema — 为用于定义 ASP.NET MVC 和 ASP.NET 数据控件的元数据的类的特性提供支持
3. System.Data.Entity.ModelConfiguration — 配置包含通过 DBModelBuilder 帮助公开功能的类

Model层的几个类:

Destination Lodging

数据访问层的DbContext派生类的 OnModelCreating()的方法主体内容如下:

Fulent API

之所以只使用了Fluent API 的方式,是因为System.ComponentModel.DataAnnotations 命名空间下的KeyAttribute,MaxLengthAttribute等特性,在.NET Framework 4.5下才能使用

如上图,对表的约束实现方式OnModelCreating()这个方法感觉亚历山大,比较好的实现方式额外增加一个对Model对象约束的类,实现方式如下:

DestinationMap

如此一来,OnModelCreating() 方法中如下图使用:

onmodelcreating

代码下载:CodeFirstDemo

参考资料:
Entity Framework专题
EF Code First 学习笔记:约定配置
EF和MVC系列文章导航

SQL70001: This statement is not recognized in this context.

关于错误:
SQL70001: This statement is not recognized in this context.
的产生原因以及解决办法。

在SQL Server Database Project中,如下图是添加脚本时的界面:

addnewitem

请注意:
Script(Build)’ — 该文件是DDL类型文件
Script(Not in build)‘ — 该文件是DML类型文件

DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL。

该错误产生的原因是在DDL类型文件中,使用了 select ,insert, update, delete 等对数据操作的语句造成。

解决方案就是:搞清楚文件类型,使用正确的操作语句。

 

C#中class的访问级别

中午吃饭前,同事问了一个问题:class 前面不加public访问修饰符时的默认访问级别是什么? 当时脑海自然而然的闪过了private 级别,但是细想感觉不对,class 是在namespace之下的,如果是Private级别的话,那么别人(同名命空间下除此以外的其他class)应该也是无法访问的。同事说是internal级别,豁然发现被自己忽略的internal有点陌生,特来探究一番。
百度一下就可以很容易知道class默认的访问级别是internal.

internal 修饰符使类、接口或成员仅在当前包中可见。当前包之外的代码不能访问 internal 成员。

但是为什么我们平时写的class都是public呢?

这是因为我们的解决方案不可能只有一个项目,一般都会创建好几个项目,比如说数据访问层,Model层等,这样至少也是2个项目了,数据访问层需要访问Model层的对象,假设Model层的class为internal级别,由于每个项目都会生成自己独立的程序集,就算这2个项目的命名空间一致,数据访问层还是无法访问到Model层的class.

还有一点,如果在web项目中,比如MVC的项目中,如果将HomeController的访问级别修改为internal级别,运行起来,你会看到错误页,提示说找不到资源。 这一点说明,public级别的class是能被反射出来的,这里需要了解IIS机制,我们知道web项目是运行在Application pool中的,如此IIS才能跨进程启动应用程序池启动web。所以一般情况下class都要指定为public访问级别。

那么internal访问级别有什么用处呢?官方给出的解释如下:
内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。例如,用于生成图形用户界面的框架可以提供 Control 和 Form 类,这两个类通过使用具有内部访问权限的成员进行合作。由于这些成员是内部的,它们不向正在使用框架的代码公开。
从定义具有内部访问能力的类型或成员的程序集外部引用该类型或成员是错误的。

参考资料:
1.internal 
2.访问修饰符