基于IoC的DependencyResolver()
上面介绍的类型DefaultControllerFactoryIControllerActivatorDefaultControllerActivatorIDependencyResolverDefaultDependencyResolver和DependencyResolver之前的关系基本上可以通过如图所示的类图来体现
图 DefaultControllerFactory + ControllerActivator + DependencyResolver
实例演示创建基于Ninject的DependencyResolver(S)
通过前面的介绍我们知道当调用构造函数创建一个DefaultControllerFactory的时候如果调用的时候默认无参构造函数后者将作为参数的ControllerActivator对象设置为Null那么默认请求用于激活Controller实例的是通过DependencyResolver类型的静态属性Current表示的DependencyResolver对象换言之我们可以通过自定义DependencyResolver的方式来实现基于IoC的Controller激活
同样是采用Ninject我们定义了一个具有如下定义的NinjectDependencyResolver与上面定义的NinjectControllerActivator类似NinjectDependencyResolver具有一个IKernel类型的只读属性Kernel该属性在构造函数中被初始化为一个StandardKernel对象对于实现的GetService和GetServices方法直接调用Kernel的TryGet和GetAll返回指定类型的实例和实例列表为了方便进行类型映射我们定义了泛型的Register<TFromTTo>方法
public class NinjectDependencyResolver : IDependencyResolver
{
public IKernel Kernel { get; private set; }
public NinjectDependencyResolver()
{
thisKernel = new StandardKernel()
}
public void Register<TFrom TTo>() where TTo: TFrom
{
thisKernelBind<TFrom>()To<TTo>()
}
public object GetService(Type serviceType)
{
return thisKernelTryGet(serviceType)
}
public IEnumerable<object> GetServices(Type serviceType)
{
return thisKernelGetAll(serviceType)
}
}
我们只需要创建一个自定义的NinjectDependencyResolver对象并将其作为当前的DependencyResolver即可如下面的代码片段所示我们创建了一个NinjectDependencyResolver对象并注册了IEmployeeRepository和EmployeeRepository之间的映射关系然后调用DependencyResolver的静态方法SetResolver将创建的NinjectDependencyResolver注册为当前的DependencyResolver对象再次运行我们的程序依然会得到如图所示的效果
public class MvcApplication : SystemWebHttpApplication
{
//其他成员
protected void Application_Start()
{
//其他操作
NinjectDependencyResolver dependencyResolver =
new NinjectDependencyResolver()
dependencyResolverRegister<IEmployeeRepository EmployeeRepository>()
DependencyResolverSetResolver(dependencyResolver)
}
}
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战