基于IoC的DependencyResolver()
如果在构建DefaultControllerFactory的时候没有显式指定采用ControllerActivator它默认使用的是一个类型为DefaultControllerActivator的对象如下面的代码片段所示这只是一个实现了IControllerActivator接口的私有类型不能直接通过编程的方式使用它
private class DefaultControllerActivator : IControllerActivator
{
public DefaultControllerActivator()
public DefaultControllerActivator(IDependencyResolver resolver)
public IController Create(RequestContext requestContext
Type controllerType)
}
即使DefaultControllerFactory采用了默认的DefaultControllerActivator依然可以将IoC引入到Controller的激活系统中而这就需要进一步了解实现在DefaultControllerActivator的Controller激活逻辑了
其实DefaultControllerActivator完成对Controller的激活依赖于另一个名为DependencyResolver的对象DependencyResolver是一个非常重要的组件可以将其视为ASPNET MVC框架内部使用的IoC容器它不只是用于针对Controller的激活框架内部很多组件的提供最终都依赖于它DependencyResolver实现了具有如下定义的SystemWebMvcIDependencyResolver接口GetService和GetServices方法分别用于根据指定的类型获取单个和所有实例
public interface IDependencyResolver
{
object GetService(Type serviceType)
IEnumerable<object> GetServices(Type serviceType)
}
整个Web默认使用的DependencyResolver可以通过SystemWebMvcDependency Resolver类型进行注册如下面的代码片段所示DependencyResolver类型具有一个静态的Current属性表示当前DependencyResolver具体对DependencyResolver的注册通过调用静态方法SetResolver来完成顺便说一下DependencyResolver类型并没有实现IDependencyResolver接口并不是真正意义上的DependencyResolver
public class DependencyResolver
{
//其他成员
private static DependencyResolver _instance;
public void InnerSetResolver(object commonServiceLocator)
public void InnerSetResolver(IDependencyResolver resolver)
public void InnerSetResolver(Func<Type object> getService
Func<Type IEnumerable<object》 getServices)
public static void SetResolver(object commonServiceLocator)
public static void SetResolver(IDependencyResolver resolver)
public static void SetResolver(Func<Type object> getService
Func<Type IEnumerable<object》 getServices)
public static IDependencyResolver Current { get; }
public IDependencyResolver InnerCurrent { get; }
}
这个被封装的DependencyResolver(指实现了接口IDependencyResolver的某个类型的对象不是指DependencyResolver类型的对象对于后者我们会采用DependencyResolver类型对象的说法)通过只读属性InnerCurrent表示而三个InnerSetResolver方法重载用于初始化该属性静态字段_instance表示当前的DependencyResolver类型对象静态只读属性Current则表示该对象内部封装的DependencyResolver对象而它通过三个静态的SetResolver进行初始化
[] []