ASP.NET MVC 3 RTM 更新(3)

五、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(下)

转载于:https://www.cnblogs.com/alby/archive/2011/03/30/aspdotnet-mvc-update-3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值