无法将控制器添加到ASP.NET MVC中的Castle.Windsor

时间:2010-12-09 23:39:06

标签: castle-windsor asp.net-mvc-3

鉴于以下设置,我有三个组件。

  

Web(ASP.NET MVC 3.0 RC1)

     

模型

     

持久性(流利的NHibernate,Castle.Windsor)

这是我的ControllerInstaller。

using System;
using System.Web.Mvc;

using Castle;
using Castle.Windsor;

using Castle.MicroKernel;
using Castle.MicroKernel.SubSystems;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;

namespace Persistence.Installers
{
    public class ControllerInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
            AllTypes
                .FromAssembly(System.Reflection.Assembly.GetExecutingAssembly())
                .BasedOn<IController>()
                .Configure(c => c.Named(
                    c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient));
        }
    }
}

这是我的ControllerFactory ......

    using System;
    using System.Web;
    using System.Web.Mvc;

    namespace Persistence.Containers
    {
        /// <summary>
        /// Utilize Castle.Windsor to provide Dependency Injection for the Controller Factory
        /// </summary>
        public class WindsorControllerFactory : DefaultControllerFactory
        {
            private readonly Castle.Windsor.IWindsorContainer container;

            public WindsorControllerFactory()
            {
                container = WindsorContainerFactory.Current();
            }

            protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
            {
                return (IController)container.Resolve(controllerType);
            }
        }
    }

这是Application_Start文件中的global.asax ..

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        // Register the Windsor Container
        ControllerBuilder.Current
            .SetControllerFactory(typeof(Persistence.Containers.WindsorControllerFactory));
    }

我收到错误

  

找不到支持服务Project.Web.Controllers.HomeController的组件

GetControllerInstance

所以,我不确定我做错了什么,为什么我不能让控制器注册。

1 个答案:

答案 0 :(得分:1)

您的Castle Windsor设置代码都属于您的Web项目。这与持久性无关。

这导致了问题,因为您的ControllerInstaller正在尝试使用以下代码在Persistence程序集而不是Web程序集中注册控制器:

System.Reflection.Assembly.GetExecutingAssembly()

因此,将IoC代码移至Web项目,它将找到您的控制器。