找不到支持服务 HomeController 的组件 - Castle Windsor 错误
No component for supporting the service HomeController was found - Castle Windsor error
我读了 this 关于 Casle Windsor 的文章。所以我有 classes BusinessLogicInstaller.cs、ControllersInstaller、IocContainer 和 WindsorControllerFactory。这是示例:
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
.LifestylePerWebRequest());
}
}
public class BusinessLogicInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component
.For<IUser>()
.ImplementedBy<User>());
}
}
public static class IocContainer
{
private static IWindsorContainer _container;
public static void Setup()
{
_container = new WindsorContainer().Install(FromAssembly.This());
WindsorControllerFactory controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
}
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
this._kernel = kernel;
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
return (IController)_kernel.Resolve(controllerType);
}
}
在Global.asaxclass我有
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// Add this line to Application_Start in Global.asax.cs to setup the IoC Container.
IocContainer.Setup();
}
}
问题出在classWindsorControllerFactory.cs这行代码:
return (IController)_kernel.Resolve(controllerType);
错误是找不到支持服务 Controllers.HomeController 的组件。哪里出错了?
我找到了解决方案...首先,我没有提到我的 MVC 项目中的一个重大差异(因为我不知道为什么那么重要)- 我有单独的控制器程序集。所以,ControllerInstallers.cs
中的这部分代码有错误:
.FromThisAssembly()
应该是:
.FromAssemblyNamed("Controllers")
我不得不对@Jan Muncinsky 表示感谢,因为你的回答以及你对 class 问题所在的提示。
我读了 this 关于 Casle Windsor 的文章。所以我有 classes BusinessLogicInstaller.cs、ControllersInstaller、IocContainer 和 WindsorControllerFactory。这是示例:
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
.LifestylePerWebRequest());
}
}
public class BusinessLogicInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component
.For<IUser>()
.ImplementedBy<User>());
}
}
public static class IocContainer
{
private static IWindsorContainer _container;
public static void Setup()
{
_container = new WindsorContainer().Install(FromAssembly.This());
WindsorControllerFactory controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
}
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
this._kernel = kernel;
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
return (IController)_kernel.Resolve(controllerType);
}
}
在Global.asaxclass我有
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// Add this line to Application_Start in Global.asax.cs to setup the IoC Container.
IocContainer.Setup();
}
}
问题出在classWindsorControllerFactory.cs这行代码:
return (IController)_kernel.Resolve(controllerType);
错误是找不到支持服务 Controllers.HomeController 的组件。哪里出错了?
我找到了解决方案...首先,我没有提到我的 MVC 项目中的一个重大差异(因为我不知道为什么那么重要)- 我有单独的控制器程序集。所以,ControllerInstallers.cs
中的这部分代码有错误:
.FromThisAssembly()
应该是:
.FromAssemblyNamed("Controllers")
我不得不对@Jan Muncinsky 表示感谢,因为你的回答以及你对 class 问题所在的提示。