2015-07-17 3 views
0

Я использую Castle Windsor для регистрации ряда интерфейсов, каждый из которых может быть создан с использованием общего заводского метода. т.е.Castle Windsor - Регистрация нескольких интерфейсов с использованием одного и того же заводского метода

container.Register(Component.For(typeof(IFirstService)) 
    .UsingFactoryMethod(k => GetService<IFirstService>()) 
    .LifeStyle.Singleton); 

container.Register(Component.For(typeof(ISecondService)) 
    .UsingFactoryMethod(k => GetService<ISecondService>()) 
    .LifeStyle.Singleton); 

Вместо добавления регистрационный код для каждого интерфейса, можно использовать метод Types зарегистрировать их все за один раз (все интерфейсы происходят из IService) например:

container.Register(Types 
    .FromThisAssembly() 
    .Where(t => typeof(IService).IsAssignableFrom(t)) 
    .Configure(c => c.UsingFactoryMethod(k => GetService<?>())); 

ответ

0

Поскольку обычные вызовы методов обычно настраиваемый компилятором, вы не можете точно сделать это во время выполнения, не ссылаясь на использование рефлексии, однако вместо подписи object GetService(Type t) вместо общего аргумента вы можете сделать это:

container.Register(Types.FromThisAssembly() 
    .BasedOn<IService>() 
    .Configure(c => 
     c.UsingFactoryMethod((k, ctx) => GetService(ctx.RequestedType)) 
    ) 
); 

Используется перегрузка UsingFactoryMethod, которая обеспечивает CreationContext.

+0

Спасибо, я догадался, что буду смотреть на отражение. К счастью, мой метод GetService - это всего лишь оболочка вокруг метода на основе объектов, поэтому ваше решение работает для меня. Ключом было найти перегрузку, которая дала бы мне необходимый тип. Я люблю замок Виндзор, но иногда документации немного не хватает! –

+0

Проблема с документацией заключается в том, что каждый использует вещи по-разному, а Windsor имеет так много точек расширяемости. Мы с удовольствием рассмотрим и объединим любые вклады в нашу документацию по GitHub с помощью запроса на перенос. –

Смежные вопросы