网上电玩城捕鱼

网上电玩城捕鱼

银河电玩城捕鱼注册则提供一个默认实现了 IControllerActivator的DefaultControllerAc

作者:apefpi 发布时间:2019-08-13 06:02

正在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)