2011-09-12 124 views
4

我使用的是Castle Windsor 3.0,它在我尝试注册控制器(我使用WCF工具和IoC作为存储库/服务层)之前完美地工作。这里是我的控制器安装程序类:Castle Windsor 3.0和ASP.NET MVC Controllers

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 。这个());

它位于另一个项目。并在那里我做调用安装代码:

public static void InstallControllers(IWindsorInstaller install) 
    { 
     _container.Install(install); 
    } 

好像我做错了什么,我希望我是因为它可能是一个“永远不会再使用测试版awny”那一刻我。

我得到一个异常:支持服务System.Web.Mvc.IController的成分,不被发现 altough我可以看到在调试模式控制器被注册在容器

+0

这一切都在那里,在异常消息。看来你试图解决你的控制器为'IController'而不是它的实现类 –

+0

嗯,我要求它正确解析controllerName中的HomeController,而不是IController。可能是我问错了,我不是吗? –

回答

1

在这种情况下添加.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"))...) 
+0

除'WithService'部分是错误的,并且只会意外工作,因为你指向你想要通过其名称的特定组件,忽略它暴露的服务。 –

+0

是的,你是对的。在这种情况下,WindsorControllerFactory应该被重构为Mark Seemann在下面提出的建议。 – isuruceanu

9

在你的ControllerFactory,你不应该解决IController而是具体的控制器类型。下面是一个典型温莎基的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); 
    } 
} 
+0

为什么匿名downvote? –

+0

这不是我,马克 –

+1

对不起,而不是投票我不小心投票,我确认你的解决方案更优雅。 – isuruceanu