asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET MVC 4框架揭秘:基于IoC的DependencyResolver(1)[1]


发布日期:2023年02月22日
 
ASP.NET MVC 4框架揭秘:基于IoC的DependencyResolver(1)[1]

基于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进行初始化

[] []

               

上一篇:ASP.NET MVC 4框架揭秘:基于IoC的DependencyResolver(1)[2]

下一篇:ASP.NET MVC 4框架揭秘:基于IoC的DependencyResolver(2)