- 查找controller时,会按照1创建路由时指定的命名空间,2ControllerFactory的命名空间列表,3全名匹配.
- 在创建路由时指定的命名空间,会放到Route的DataTokens中,对应到RouteData的DataTokens中.AreaReg..的时候,创建路由时如果不指定命名空间,如果Area..类有命名空间,会使用这个命名空间+*,加入到DataTokens中.如果这个类没有命名空间,则namespaceFallback属性为True,使用后被命名空间.
- ControllerFactory.GetControllerSessionBehavior方法也是首先找到Controller的类,读取类的特性
- List.Any()可以用于判断是否包含任何元素
- 基于IOC的Controller激活有
- 自定义ControllerFactory,在其内部定义IOC,在GetControllerlnstance方法中调用IOC,创建Controller对象.
- DefaultControllerFactory内部实现机制是通过ControllerActivator实现Controller的创建的,DefaultControllerFactory有一个构造函数接收ControllerActivator的实例.所以可以创建ControllerActivator的子类,在其内部定义IOC,在Create中调用IOC,创建Controller
如果不指定ControllerActivator,则使用默认的内部类DefaultControllerActivator.
public interface IControllerActivator { IController Create(RequestContext requestContext, Type controllerType); }
3.DefaultControllerActivator是一个内部类,外部不能使用,其构造函数中包含一个IDepencyResolver,如果不指定的话会使用 DependencyResolver.Current,而这个Current中默认使用的是DefaultDependencyResolver.DependencyResolver有一个方法SetResover可以设置使用的Resolver.因此,可以自定义Resolver,调用Set方法设置默认的Resolver.
DependencyResolver 是一个非常重要的组件,可以将其视为ASP.NET MVC 框架内部使用的IoC 容器。它不只是用于针对Controller 的激活,框架内部很多组件的提供最终都依赖于它。
//Controller激活的三种方式 //1 //MyControllerFactory //ControllerBuilder.Current.SetControllerFactory(MyControllerFactory); //2 //MyControllerActivtor //DefaultControllerFactory factory = new DefaultControllerFactory(MyControllerActivtor); //ControllerBuilder.Current.SetControllerFactory(factory); //3 //MyDependencyResolver //DependencyResolver.SetResolver(MyDependencyResolver);