Dependency injection 温莎城堡:无法解析控制器
我试图在我的解决方案中使用DI(即Castle Windsor),但我得到以下例外:Dependency injection 温莎城堡:无法解析控制器,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,我试图在我的解决方案中使用DI(即Castle Windsor),但我得到以下例外: No component for supporting the service Company.Web.Controllers.DashboardController was found 尝试解析控制器(即:(IController)\u kernel.resolve(controllerType);)时,WindsorController工厂.GetControllerInstance()中出现此异常 但是
No component for supporting the service Company.Web.Controllers.DashboardController was found
尝试解析控制器(即:(IController)\u kernel.resolve(controllerType);
)时,WindsorController工厂.GetControllerInstance()中出现此异常
但是,当我将DI安装程序和控制器工厂移动到asp.net应用程序中,并让该web项目引用解决方案中的所有项目时,不会发生异常
问题:如何解决异常及以上问题,并将依赖项注入及其配置放入自己的程序集(即:Company.Initialization)?
请随时提供任何建设性的批评,以改进代码
当前解决方案项目设置
namespace Company.Initialization
{
public class ControllersInstaller : IWindsorInstaller
{
/// <summary>
/// Installs the controllers
/// </summary>
/// <param name="container"></param>
/// <param name="store"></param>
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().LifestyleTransient());
}
/// <summary>
/// Find controllers within this assembly in the same namespace as HomeController
/// </summary>
/// <returns></returns>
private BasedOnDescriptor FindControllers()
{
return AllTypes.FromAssemblyNamed("Company.Web")
.BasedOn<IController>()
.If(Component.IsInNamespace(@"Company.Web.Controllers"))
.If(t => t.Name.EndsWith("Controller"));
}
}
}
namespace Company.Initialization
{
public class RepoInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromAssemblyNamed("Company.Services")
.Where(type => type.Name.EndsWith("Service"))
.WithService.DefaultInterfaces().LifestyleSingleton());
container.Register(AllTypes.FromAssemblyNamed("Company.NHibernateProvider")
.Where(type => type.Name.EndsWith("Repository"))
.WithService.DefaultInterfaces().LifestyleSingleton());
}
}
}
namespace Company.Initialization
{
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
/// <summary>
/// Constructor
/// </summary>
/// <param name="kernel"></param>
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
/// <summary>
/// Release the controller at the end of it's life cycle
/// </summary>
/// <param name="controller">The Interface to an MVC controller</param>
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
/// <summary>
/// Resolve a controller dependency
/// </summary>
/// <param name="requestContext">The HTTP context</param>
/// <param name="controllerType">Type of controller to resolve</param>
/// <returns>IController</returns>
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);
}
}
}
WindsorControllerFactory.cs
namespace Company.Initialization
{
public class ControllersInstaller : IWindsorInstaller
{
/// <summary>
/// Installs the controllers
/// </summary>
/// <param name="container"></param>
/// <param name="store"></param>
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().LifestyleTransient());
}
/// <summary>
/// Find controllers within this assembly in the same namespace as HomeController
/// </summary>
/// <returns></returns>
private BasedOnDescriptor FindControllers()
{
return AllTypes.FromAssemblyNamed("Company.Web")
.BasedOn<IController>()
.If(Component.IsInNamespace(@"Company.Web.Controllers"))
.If(t => t.Name.EndsWith("Controller"));
}
}
}
namespace Company.Initialization
{
public class RepoInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromAssemblyNamed("Company.Services")
.Where(type => type.Name.EndsWith("Service"))
.WithService.DefaultInterfaces().LifestyleSingleton());
container.Register(AllTypes.FromAssemblyNamed("Company.NHibernateProvider")
.Where(type => type.Name.EndsWith("Repository"))
.WithService.DefaultInterfaces().LifestyleSingleton());
}
}
}
namespace Company.Initialization
{
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
/// <summary>
/// Constructor
/// </summary>
/// <param name="kernel"></param>
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
/// <summary>
/// Release the controller at the end of it's life cycle
/// </summary>
/// <param name="controller">The Interface to an MVC controller</param>
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
/// <summary>
/// Resolve a controller dependency
/// </summary>
/// <param name="requestContext">The HTTP context</param>
/// <param name="controllerType">Type of controller to resolve</param>
/// <returns>IController</returns>
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);
}
}
}
名称空间公司。初始化
{
公共类WindsorController工厂:DefaultControllerFactory
{
私有只读IKernel_内核;
///
///建造师
///
///
公共WindsorController工厂(IKernel内核)
{
_内核=内核;
}
///
///在控制器的生命周期结束时释放控制器
///
///MVC控制器的接口
公共覆盖无效释放控制器(IController控制器)
{
_内核释放组件(控制器);
}
///
///解析控制器依赖项
///
///HTTP上下文
///要解析的控制器类型
///i控制器
受保护的重写IController GetControllerInstance(RequestContext RequestContext,类型controllerType)
{
如果(controllerType==null)
{
抛出新的HttpException(404,string.Format)(“找不到路径{0}的控制器。”,
requestContext.HttpContext.Request.Path));
}
返回(IController)\内核解析(controllerType);
}
}
}
是否已检查所有程序集是否确实存在于执行应用程序的目录中?您能否检查一下,如果您单独注册仪表板控制器组件,会发生什么情况?在单独的项目中安装程序不是一个好的做法。它们应该在您的web应用程序项目中。@Marwjin:程序集在那里。@rarous:如果我将安装程序放在web项目中,那么这意味着我的web项目必须引用数据访问层,这不是一个好的做法,不是吗?@burnt1ce它也在您的解决方案中。间接的,但有。引用DAL和从UI层调用DAL是两件不同的事情。您的web项目也是应用程序的合成根。