Controller

  • 查找controller时,会按照1创建路由时指定的命名空间,2ControllerFactory的命名空间列表,3全名匹配.
  • 在创建路由时指定的命名空间,会放到Route的DataTokens中,对应到RouteData的DataTokens中.AreaReg..的时候,创建路由时如果不指定命名空间,如果Area..类有命名空间,会使用这个命名空间+*,加入到DataTokens中.如果这个类没有命名空间,则namespaceFallback属性为True,使用后被命名空间.
  • ControllerFactory.GetControllerSessionBehavior方法也是首先找到Controller的类,读取类的特性
  • List.Any()可以用于判断是否包含任何元素
  • 基于IOC的Controller激活有
    1. 自定义ControllerFactory,在其内部定义IOC,在GetControllerlnstance方法中调用IOC,创建Controller对象.
    2. 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);
原文地址:https://www.cnblogs.com/zhangliming/p/4564751.html