Замок Виндзор 3.0 и ASP.NET MVC Контроллеры - PullRequest
4 голосов
/ 12 сентября 2011

Я использую Castle Windsor 3.0, и он отлично работал для меня, пока я не попытался зарегистрировать контроллеры (я использовал WCF и IoC для уровня хранилища / обслуживания). Вот мой класс установщика контроллеров:

public class ControllersInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        RegisterAllBasedOnWithCustomComponentRegistration(container, typeof(IController),
            typeof(HomeController).Assembly,
            cr => cr.LifeStyle.Transient);

    }

    private void RegisterAllBasedOnWithCustomComponentRegistration(IWindsorContainer container, Type baseType,
    Assembly assemblyWithImplementations, Func<ComponentRegistration, ComponentRegistration<object>> customComponentRegistrationCb)
    {
        container.Register(
            AllTypes.FromAssembly(assemblyWithImplementations)
                .BasedOn(baseType)
                .If(t => t.Name.EndsWith("Controller"))
                .Configure(c => customComponentRegistrationCb(c)));
    }
}

А вот мой контроллер фабрики:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        _kernel.ReleaseComponent(controller);
    }

    public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        var controllerComponentName = controllerName + "Controller";
        return _kernel.Resolve<IController>(controllerComponentName);
    }
}

Из моего global.asax я вызываю следующий метод:

InversionOfControl.InstallControllers (FromAssembly.This ());

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

    public static void InstallControllers(IWindsorInstaller install)
    {
        _container.Install(install);
    }

мне кажется, что я делаю что-то не так, и я надеюсь, что это так, потому что это может быть моментом "никогда больше не используй бета-версию".

Я получаю следующее исключение: Не найден компонент для поддержки службы System.Web.Mvc.IController Хотя я вижу, что контроллер в режиме отладки зарегистрирован в контейнере

Ответы [ 2 ]

9 голосов
/ 12 сентября 2011

В вашей ControllerFactory вам не нужно разрешать IController, а конкретный тип контроллера. Вот типичная Виндзорская база ControllerFactory, которую я всегда использую:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IWindsorContainer _container;

    public WindsorControllerFactory(IWindsorContainer container)
    {
        _container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return (IController)_container.Resolve(controllerType);
    }

    public override void ReleaseController(IController controller)
    {
        _container.Release(controller);
    }
}
1 голос
/ 12 сентября 2011

В этом случае добавьте .WithServices (typeof (IController)) и назовите все компоненты.

cr => cr.LifeStyle.Transient.Named(cr.Implementation.Name)

и ваша регистрация должна выглядеть так:

.Register(
AllTypes.FromAssembly(assemblyWithImplementations)
        .BasedOn(baseType)
        .WithServices(typeof(IController))
        .If(t => t.Name.EndsWith("Controller"))...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...