• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET MVC 3 RTM 更新(3)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
五、SessionStateAttribute

构造SessionStateAttribute对象时必须传入一个SessionStateBehavior枚举值,通过Attribute的Behavior属性可以获取该值。
该Attribute只能用于引用类型(AttributeTargets.Class),不允许重复使用(AllowMultiple=false),允许继承(Inherited=true)。

六、MvcRouteHandler

MvcRouteHandler类增加了一个接受IControllerFactory接口实现类的对象作为参数传的构造方法,构造对象允许传入null值。而构造方法内部只是简单的将参数赋给一个私有变量_controllerFactory。

还增加了一个GetSessionStateBehavior虚方法,接受RequestContext型参数,返回一个SessionStateBehavior对象。
在方法内部,创建一个名为controllerFactory的IControllerFactory型局部变量。
如果私有变量_controllerFactory不为null,则赋给controllerFactory,否则通过ControllerBuilder.Current.GetControllerFactory()获取默认的ControllerFactory(注意,并非就一定是DefaultControllerFactory)赋值。然后返回controllerFactory的GetControllerSessionBehavior方法的执行结果。

GetControllerSessionBehavior方法是IControllerFactory接口新增的。
在DefaultControllerFactory中,GetControllerSessionBehavior是通过反射来获取对应Controller的SessionStateAttribute(会进行缓存),并返回它的Behavior属性。

MvcRouteHandler类的GetHttpHandler方法中,会调用GetSessionStateBehavior方法获取一个SessionStateBehavior枚举值,并通过当前请求上下文的SetSessionStateBehavior设置当前请求的SessionState。当然,GetHttpHandler方法返回的是一个new出来的MvcHandler对象。

从这里我们不难看出MVC3给我们提供的一个新的扩展点:
1、通过接受IControllerFactory接口实现类的对象作为参数传的构造方法创建MvcRouteHandler(RouteCollectionExtensions.MapRoute是通过无参构造方法创建对象)。
2、实现新的IControllerFactory来达到不以默认方式获取Controller对应的SessionStateBehavior(比如通过直接缓存而不是通过反射再缓存),或者设置某些命名空间下全局的SessionStateBehavior。
3、甚至我们可以实现ActionSessionStateAttribute,设置某个Action的SessionStateBehavior而不是整个Controller。

七、IControllerActivator和DefaultControllerFactory

我们知道,ControllerFactory是为了创建Controller而生,在以上的内容中对此也有所提及。
在MVC3中的DefaultControllerFactory类中,使创建Controller的方式更灵活,并能配合DI(详见DenpendencyResolver相关)。
首先增加了一个带IControllerActivator接口参数的公共构造方法。
IControllerActivator接口的唯一方法Create类似于GetControllerInstance方法。
我们知道MVC2的DefaultControllerFactory类中的GetControllerInstance方法直接使用Activator.CreateInstance类创建对象。
通过MVC3中新增的有参公共构造函数,我们可以很容易的改变这种方式。在MV2中我们如果想改变,得重新实现一个IControllerFactory或继承DefaultControllerFactory类重写GetControllerInstance需方法。

DefaultControllerFactory还提供了一个internal的带三个参数的构造方法。该方法的实现机制类似于ControllerBuilder,这里就不再重复分析。
可以想象,如果该构造函数是public的,我们就用DefaultControllerFactory就可以灭掉很多之前MVC2中,仅为了创建带有参构造函数Controller类而实现的ControllerFactory。


八、Filter

MVC3新增加了Filter相关的若干类或枚举:
Filter、FilterProviderCollection、FilterProviders、
GlobalFilterCollection、GlobalFilters、
FilterAttributeFilterProvider、ControllerInstanceFilterProvider、
FilterScope

关于Filter的讨论在很久以前就做过:
ASP.Net MVC探索之路 - 不想在多个Action上写同样的FitlerAttribute(上)
ASP.Net MVC探索之路 - 不想在多个Action上写同样的FitlerAttribute(下)

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap