Невозможно добавить контроллеры в Castle.Windsor в ASP.NET MVC

StackOverflow https://stackoverflow.com/questions/4404261

  •  25-09-2019
  •  | 
  •  

Вопрос

Учитывая следующие настройки, у меня есть три сборки.

Веб (ASP.NET MVC 3.0 RC1)

Моделей

Настойчивость (свободно Nibernate, Castle.windsor)

Это мой контроллер.

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));
        }
    }
}

Это моя контролируемая продукция ...

    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));
    }

Я получаю ошибку

Нет компонента для поддержки сервисной проекции .Web.controllers.homecontroller

на GetControllerInstance.

Итак, я не совсем уверен, что я делаю не так, и почему я не могу зарегистрирован контроллеры.

Это было полезно?

Решение

Ваш замок Windsor Setup Code принадлежит в вашем веб-проекте. Это не имеет ничего общего с настойчивостью.

Это вызывает проблему, потому что ваша ControllerInstaller Пытается зарегистрировать контроллеры в узел настойчивости, а не на веб-сборке со следующим кодом:

System.Reflection.Assembly.GetExecutingAssembly().

Поэтому переместите код IOC в веб-проект, и он найдет ваши контроллеры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top