admin 管理员组文章数量: 887239
2024年1月13日发(作者:网页小游戏)
使用Unity进行依赖注入MVC4中的三种方式
在 MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller依赖于ModelRepository的抽象而不是它的实现。下面长沙IT培训就和大家一起来学习怎样使用Unity进行依赖注入MVC4中的三种方式:
我们可以在三个阶段使用IoC实现上面所说的解耦操作,首先需要简单介绍一下默认情况下Controller的激活过程:
1、用户发送请求黑,路由系统对请求进行解析,根据注册的路由规则对请求进行匹配,解析出Controller和Action的名称等信息。
2、将解析出的信息交给一个MvcRouteHandler对象进行处理,MvcHttpHandler中存在以个ControllerFactory成员,如果构造函数中没有提供一个实现IControllerFactory接口的对象,则默认构造函数通过调用trollerFactory()获取一个这样的对象。
3、系统调用上文对象中德GetHttpHandler获得了一个实现了IHttpHandler接口的MvcHandler对象最终处理请求。
4、在 MvcHandler中调用BeginProcessRequest方法继续处理请求,方法中从1中解析的信息中获得Controller和Action 的信息,而后利用2种的IControllerFactory对象激活Controller对象,并最终执行相应的Action。
第一种方法
由上文2种可知,我们可以创建自己的IControllerFactory对象实现依赖注入,然而我们可以通过直接继承 DefaultControllerFactory并重写GetControllerInstance方法来实现,这样可以免去重新实现其他一些功能的工作。
以下是使用Unity创建的继承自DefaultControllerFactory的UnityControllerFactory的简单示例:
namespace UnitySample
{
public class UnityControllerFactory:DefaultControllerFactory
{
private IUnityContainer container;
public UnityControllerFactory(IUnityContainer container)
{
ner = container;
}
protected override IController GetControllerInstance(RequestContext
requestContext, Type controllerType)
{
return null == controllerType ? null :
(IController)e(controllerType);
//return trollerInstance(requestContext, controllerType);
}
}
}
我们可以在App_Start中使用ControllerBuilder设置系统使用这个ControllerFactory
IUnityContainer container = new UnityContainer();
erType();
UnityControllerFactory factory = new UnityControllerFactory(container);
trollerFactory(factory);
第二种方法
上文中继承的DefaultControllerFactory中,使用一个ControllerActivator的成员来实现对 Controller的激活,如果创建对象中没有提供一个IControllerActivator对象,则提供一个默认实现了 IControllerActivator的DefaultControllerActivator对象这个类型,这个接口中存在用于创建 Controller对象的Create方法,在DefaultControllerFactory中有存在一个 IControllerActivator类型的构造方法来制定它。所以我们可以使用一个自定义的实现自IControllerActivator借口的对象来进行依赖注入。
namespace UnitySample
{
public class UnityControllerActivator:IControllerActivator
{
private IUnityContainer container;
public UnityControllerActivator(IUnityContainer container)
{
ner = container;
}
public IController Create(RequestContext requestContext, Type
controllerType)
{
return controllerType == null ? null :
(IController)erType(controllerType);
}
}
}
修改方法1中在App_Start中的代码,使用这个ControllerActivator:
IUnityContainer container = new UnityContainer();
erType();
//UnityControllerFactory factory = new UnityControllerFactory(container);
IControllerActivator controllerActivator = new
UnityControllerActivator(container);
DefaultControllerFactory defaultFactory = new
DefaultControllerFactory(controllerActivator);
trollerFactory(defaultFactory);
第三种方法
如同DefaultControllerFactory类中一样,在DefaultControllerActivator中也存在一个包含一个参数(类型为IDependencyResolver)的构造方法和一个没有参数的构造方法,默认情况下DefaultControlerFactory使用无参构造函数实例化一个DefaultControllerActivator对象,这种情况下提供一个默认的IDependencyResolver
对象。所以我们就同样可以使用一个自定义的IDependencyResolver类实现依赖注入。在IDependencyResolver接口中存在方法GetService和GetServices来对具体的类型进行解析
namespace UnitySample
{
public class UnityDependencyResolver:IDependencyResolver
{
private IUnityContainer container;
public UnityDependencyResolver(IUnityContainer container)
{
ner = container;
}
public object GetService(Type serviceType)
{
return e(serviceType);
}
public IEnumerable GetServices(Type serviceType)
{
return eAll(serviceType);
}
}
}
修改App_Strat中的方法,使用这个自定义的DependencyResolver:
IUnityContainer container=new UnityContainer();
er Type();
UnityDependencyResolver resolver=new
UnityDependencyResolver(container);
olver(resolver)
版权声明:本文标题:使用Unity进行依赖注入MVC4中的三种方式 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1705141624h474431.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论