В Unity (2.0) я регистрирую два именованных интерфейса IFoo
, сопоставленных с двумя различными реализациями:
Container
.RegisterType<IFoo, Foo1>("first")
.RegisterType<IFoo, Foo2>("second");
Ну, у меня есть такая служба:
public class ServiceImpl : IService {
public ServiceImpl(IFoo foo, IDependency dep, IJustAnother stuff) { ... }
public MyValueObject[] FindVOs() { ... }
}
Если хотите зарегистрировать две именованные службы, каждая в зависимости от одной IFoo
, я напишу это:
Container
.RegisterType<IService, ServiceImpl>(
"first",
new InjectionConstructor(
new ResolvedParameter<IFoo>("first"),
new ResolvedParameter<IDependency>(),
new ResolvedParameter<IJustAnother>()
)
)
.RegisterType<IService, ServiceImpl>(
"second",
new InjectionConstructor(
new ResolvedParameter<IFoo>("second"),
new ResolvedParameter<IDependency>(),
new ResolvedParameter<IJustAnother>()
)
)
Это работает, но я считаю это уродливым и не умным, потому что для каждой новой реализации IFoo
Мне нужно добавить два RegisterType
звонка.Есть ли лучший способ (возможно, с расширением)?
Еще один вопрос: как Виндзорский контейнер справляется с этим?с автоматической регистрацией?
* РЕДАКТИРОВАТЬ *
Например, если мне нужен CompositeService, подобный этому:
public class CompositeService : IService {
public ServiceImpl(IService[] services) { _services = services; }
public MyValueObject[] FindVOs() {
return _services.SelectMany(_ => _.FindVOs() );
}
}
Я мог бы зарегистрировать этопуть:
Container
.RegisterType<IService, CompositeService>();
и Unity внедрит все именованные регистрации в составной конструктор.Проблема в том, что таким образом он работает, только давая имя всем IService
.И я не могу ввести IFoo[]
вместо IService
, потому что IFoo
используется только ServiceImpl
, который является конкретной реализацией IService
.Вот почему я спросил, есть ли лучший способ зарегистрировать их, избегая избыточности, в Unity.