我正在使用Castle 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测试版”的时刻对我。
我得到了下一个异常:没有支持服务System.Web.Mvc.IController的组件,也找到了,我可以看到控制器在调试模式下在容器中注册
发布于 2011-09-12 14:02:38
在本例中,添加.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"))...)发布于 2011-09-12 13:05:18
在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);
}
}https://stackoverflow.com/questions/7387035
复制相似问题