Рассмотрим следующий сценарий служб и компонентов в образце консольного приложения C #
public interface IService { }
public class FooService: IService { }
public class BarService: IService { }
public class BuzzService: IService { }
public class AwesomeService: IService { }
public class Consumer
{
public Consumer(IEnumerable<IService> services)
{
// do some initilization work here...
}
}
public class AnotherConsumer
{
public AnotherConsumer(IEnumerable<IService> services)
{
// do some initilization work here...
}
}
Представим себе, что нужно выполнить следующие регистрации внутри корня композиции:
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, true));
container.Register(Component.For<IService>().ImplementedBy<FooService>());
container.Register(Component.For<IService>().ImplementedBy<BarService>());
container.Register(Component.For<IService>().ImplementedBy<BuzzService>());
container.Register(Component.For<IService>().ImplementedBy<AwesomeService>());
container.Register(Component.For<Consumer>());
container.Register(Component.For<AnotherConsumer>());
// consumer got injected all 4 different implementations of IService
// due to CollectionResolver
var consumer = container.Resolve<Consumer>();
// anotherConsumer got injected all 4 different implementations of
// IService due to CollectionResolver
var anotherConsumer = container.Resolve<AnotherConsumer>();
Этот видСценарий работает нормально, и я делал это несколько раз.
Что, если по какой-то причине я хотел бы внедрить внутри конструктора класса Consumer * только 1010 * двух разных реализаций IService , например, только FooService и BarService (, продолжая внедрять все доступные реализации IService в конструктор AnotherConsumer )?
Есть ли элегантный способ сделать это?