【问题标题】:How do I use Castle Windsor a different assembly from mvc web application?如何使用 Castle Windsor 与 mvc Web 应用程序不同的程序集?
【发布时间】:2015-01-07 19:57:24
【问题描述】:

我被困住了。我想在不同的类库中配置 Castle Windsor 并且我配置了,构建很好,没有错误,好的...但是我在运行时遇到异常。

Castle.MicroKernel.ComponentNotFoundException:找不到支持服务 App.Web.UI.Controllers.HomeController 的组件

当我将配置文件返回到同一个程序集 (App.Web.UI) 时,我在运行时没有收到任何异常,工作正常。

我尝试了很多方法,但我做不到。除了 FromThisAssembly 还有其他绑定方法吗?还是解决方案?

温莎城堡配置在这里:

namespace App.Infrastructure.Configurations
{
    public class WindsorControllerFactory : DefaultControllerFactory
    {
        private readonly IKernel _kernel;

        public WindsorControllerFactory(IKernel kernel)
        {
            _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);
        }
    }

    public class ControllersInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly().BasedOn<IController>().Unless(x => x.Name == "BaseController").LifestyleTransient());
        }
    }

    public class ServiceInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For(typeof (IRepository<>)).ImplementedBy(typeof (Repository<>)).LifestyleTransient(),
                Component.For<IUserService>().ImplementedBy<UserService>().LifestylePerWebRequest(),
                Component.For<IFormsAuthenticationService>().ImplementedBy<FormsAuthenticationService>().LifestylePerWebRequest(),
                Component.For<ILoggingService>().ImplementedBy<LoggingService>().LifestyleTransient(),
                Component.For<IFeedbackService>().ImplementedBy<FeedbackService>().LifestylePerWebRequest()
                ); 
        }
    }
}

【问题讨论】:

  • 欢迎来到 StackOverflow!如所写,您的问题很难理解。您是否有可能让一位以英语为母语的同事与您一起复习?

标签: c# asp.net-mvc castle-windsor


【解决方案1】:

在您的代码中,Classes.FromThisAssembly() 引用了包含您的 Windsor 内容的程序集,而不是您的 Web 应用程序。尝试告诉 Windsor 注册来自特定装配的组件。这应该有效:

Classes.FromAssembly(Assembly.GetEntryAssembly())

入口程序集应该是运行 MVC 代码的 AppDomain。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多