Castle Windsor - Регистрация компонентов

Я создал общий статический класс для регистрации компонентов всего решения.

private static readonly IWindsorContainer Container = new WindsorContainer();

public static void Register<I, T>() where T : I
    {
        Container.Register(
            Component.For<I>().ImplementedBy<T>().LifeStyle.Transient
            );
    }

Однако я не могу его скомпилировать. Есть идеи?

Тип «I» должен быть ссылочным типом, чтобы использовать его в качестве параметра «TService» в универсальном типе или методе «Castle.MicroKernel.Registration.Component.For()».


person user3466917    schedule 27.03.2014    source источник
comment
А что именно не работает?   -  person Steven    schedule 27.03.2014
comment
Не могли бы вы предоставить тест, который не работает, чтобы дать больше информации. Если нужно, могу написать тест, подтверждающий мой ответ.   -  person Ilya Palkin    schedule 27.03.2014
comment
в методе Register, если это не T : I, поскольку T реализует I в соответствии с Component.For‹I›().ImplementedBy‹T›(), а не где I : T   -  person Michal Ciechan    schedule 27.03.2014
comment
Я обновил свой вопрос, чтобы он был более точным, и исправил свою предыдущую опечатку I:T.   -  person user3466917    schedule 28.03.2014


Ответы (2)


Как указано в предупреждении, I должен быть ссылочным типом, поэтому для его ограничения требуется общее ограничение.

public static void Register<I, T>() where T : I where I : class
{
    Container.Register(
        Component.For<I>().ImplementedBy<T>().LifestyleTransient());
}

Вы также можете рассмотреть использование типов IWindsorInstaller для регистрации компонентов в контейнере, а затем зарегистрировать компоненты в контейнере с помощью установщиков.

Например

public class MvcInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            // Register HttpContextBase using factory method
            Component.For<HttpContextBase>()
                     .UsingFactoryMethod(() => 
                         new HttpContextWrapper(HttpContext.Current))
                     .LifestylePerWebRequest(),
            // Convention based registration to register all controllers
            // with Windsor
            Classes.FromThisAssembly()
                   .BasedOn<IController>()
                   .If(t => t.Name.EndsWith("Controller"))
                   .Configure(c => c.LifestylePerWebRequest()),
            Component.For<IControllerFactory>()
                     .ImplementedBy<WindsorControllerFactory>());
    }
}

Затем при создании контейнера

var container = new WindsorContainer();

// find all installers in the current assembly and use them to register 
// services with the container
container.Install(FromAssembly.This());
person Russ Cam    schedule 27.03.2014

Если вы хотите разрешать зарегистрированные типы, вы должны использовать тот же экземпляр IWindsorContainer.

Типы не будут разрешены, если вы используете еще один экземпляр IWindsorContainer.

person Ilya Palkin    schedule 27.03.2014