![](/img/trans.png)
[英]Castle Windsor ASP.NET MVC 4 and Web API same application. Only if MVC controllers have no dependencies?
[英]Castle windsor 3.0 and ASP.NET MVC Controllers
我正在使用Castle Windsor 3.0,它對我來說非常有效,直到我嘗試注冊控制器(我使用WCF工具和IoC作為存儲庫/服務層)。 這是我的控制器安裝程序類:
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
RegisterAllBasedOnWithCustomComponentRegistration(container, typeof(IController),
typeof(HomeController).Assembly,
cr => cr.LifeStyle.Transient);
}
private void RegisterAllBasedOnWithCustomComponentRegistration(IWindsorContainer container, Type baseType,
Assembly assemblyWithImplementations, Func<ComponentRegistration, ComponentRegistration<object>> customComponentRegistrationCb)
{
container.Register(
AllTypes.FromAssembly(assemblyWithImplementations)
.BasedOn(baseType)
.If(t => t.Name.EndsWith("Controller"))
.Configure(c => customComponentRegistrationCb(c)));
}
}
這是我的控制器工廠:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
var controllerComponentName = controllerName + "Controller";
return _kernel.Resolve<IController>(controllerComponentName);
}
}
從我的global.asax我調用下一個方法:
InversionOfControl.InstallControllers(FromAssembly.This());
這是另一個項目。 在那里我打電話給安裝代碼:
public static void InstallControllers(IWindsorInstaller install)
{
_container.Install(install);
}
看起來我做錯了什么,我希望我是因為它可能是一個“永遠不會再使用awny beta”的時刻。
我得到了下一個異常: 找不到支持System.Web.Mvc.IController服務的組件了,盡管我可以看到調試模式下的控制器正在容器中注冊
在你的ControllerFactory中,你不應該解析IController
而不是具體的控制器類型。 這是我一直使用的典型Windsor基ControllerFactory:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer _container;
public WindsorControllerFactory(IWindsorContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return (IController)_container.Resolve(controllerType);
}
public override void ReleaseController(IController controller)
{
_container.Release(controller);
}
}
在這種情況下,添加.WithServices(typeof(IController))並命名所有組件。
cr => cr.LifeStyle.Transient.Named(cr.Implementation.Name)
並且您的注冊應如下所示:
.Register(
AllTypes.FromAssembly(assemblyWithImplementations)
.BasedOn(baseType)
.WithServices(typeof(IController))
.If(t => t.Name.EndsWith("Controller"))...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.