Dependency injection 温莎城堡:无法解析控制器

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()中出现此异常 但是

我试图在我的解决方案中使用DI(即Castle Windsor),但我得到以下例外:

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)?

请随时提供任何建设性的批评,以改进代码

当前解决方案项目设置

  • Company.Initialization位于名为Company.Initialization的程序集中。此程序集包含DI配置和Castle Windosr的引用
  • 初始化具有对每个程序集的引用
  • Web位于名为Company.Web的程序集中
  • Web是一个ASP.NET MVC4应用程序
  • controllerinstaller.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);
            }
    
        }
    }
    
    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项目也是应用程序的合成根。