Контейнер Windsor Ioc: как зарегистрировать, что определенные конструкторы используют разные реализации интерфейса - PullRequest
0 голосов
/ 21 октября 2011

У меня есть много классов, которые принимают IMyService в качестве аргумента конструктора.

например,

ClassA(IMyservice myservice)
// this should take a Concrete1 for IMyService

ClassB(IMyservice myservice)
// this should take a Concrete2 for IMyService

Как мне зарегистрироваться, чтобы ClassB получил Concrete2, а ClassA получил Concrete1?

Плюс, есть ли способ сделать один значением по умолчанию и указать только экземпляры, которые отличаются от значения по умолчанию?(Поскольку большинство примет Concrete1, и только небольшое число примет Concrete2.)

Я использую свободный интерфейс, НЕ XML-конфигурация.

1 Ответ

1 голос
/ 21 октября 2011

Использование переопределений услуг:

var container = new WindsorContainer();
container.Register(
    Component.For<IMyService>().ImplementedBy<Concrete1>().Named("C1"),
    Component.For<IMyService>().ImplementedBy<Concrete2>().Named("C2"),
    Component.For<ClassA>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("C1")),
    Component.For<ClassB>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("C2"))
);
...