簡體   English   中英

Castle windsor 3.0和ASP.NET MVC控制器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM