您现在的位置:澳门网上真人龙虎 > 菲律宾申博官方网址 > 全球前三名的博彩公司使用这个自定义的DependencyResolver: IUnityContainer contai

全球前三名的博彩公司使用这个自定义的DependencyResolver: IUnityContainer contai

2019-08-15 17:26

正在ASP.NET MVC4中,为了正在解开Controller和Model的耦合,我们通常须要正在Controller激活系统中引入IoC,太阳城真人真钱网址,用于处理用户恳求的 Controller,让Controller依赖于ModelRepository的笼统而不是它的实现。

我们能够正在三个阶段运用IoC实现上面所说的解耦操作,起首须要单一先容一下默认状况下Controller的激活过程:

1、用户发送恳求黑ASP.NET,谈由系统对恳求举行解析,根据注册的谈由规则对恳求举行立室,解析出Controller和Action的名称等信休。

2、将解析出的信休交给一个MvcRouteHandler对象举行处理,MvcHttpHandler中保管以个ControllerFactory成员,若是机关函数中没有提供一个实现IControllerFactory接口的对象,则默认机关函数通过挪用ControllerBuilder.Current.GetControllerFactory()获取一个这样的对象。

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)

{

this.container = container;

}

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)

{

return null == controllerType ? null : (IController)this.container.Resolve(controllerType);

//return base.GetControllerInstance(requestContext, controllerType);

}

}

}

我们能够正在App_Start中运用ControllerBuilder设置系统运用这个ControllerFactory

IUnityContainer container = new UnityContainer();

container.RegisterType();

UnityControllerFactory factory = new UnityControllerFactory(container);

ControllerBuilder.Current.SetControllerFactory(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)

{

this.container = container;

}

public IController Create(RequestContext requestContext, Type controllerType)

{

return controllerType == null ? null : (IController)container.RegisterType(controllerType);

}

}

}

批改步骤1中正在App_Start中的代码,运用这个ControllerActivator:

IUnityContainer container = new UnityContainer();

container.RegisterType();

//UnityControllerFactory factory = new UnityControllerFactory(container);

IControllerActivator controllerActivator = new UnityControllerActivator(container);

DefaultControllerFactory defaultFactory = new DefaultControllerFactory(controllerActivator);

ControllerBuilder.Current.SetControllerFactory(defaultFactory);

第三种步骤

好像DefaultControllerFactory类中雷同,正在DefaultControllerActivator中也保管一个包括一个参数(类型为IDependencyResolver)的机关步骤和一个没有参数的机关步骤,默认状况下DefaultControlerFactory运用无参机关函数事俘化一个DefaultControllerActivator对象,这种状况下提供一个默认的IDependencyResolver 对象。以是我们就同样能够运用一个自定义的IDependencyResolver类实现依赖注入。正在IDependencyResolver接口中保管步骤GetService和GetServices来对详尽的类型举行解析

namespace UnitySample

{

public class UnityDependencyResolver:IDependencyResolver

{

private IUnityContainer container;

public UnityDependencyResolver(IUnityContainer container)

{

this.container = container;

}

public object GetService(Type serviceType)

{

return container.Resolve(serviceType);

}

public IEnumerable<object>GetServices(Type serviceType)

{

return container.ResolveAll(serviceType);

}

}

}

批改App_Strat中的步骤,运用这个自定义的DependencyResolver:

IUnityContainer container=new UnityContainer();

container.Register Type<IXXXRepository,XXXRepository>();

UnityDependencyResolver resolver=new UnityDependencyResolver(container);

DependencyResolver.SetResolver(resolver)