Say У меня есть два класса, которые инстанцированы на замке Виндзор, и каждый из них имеет зависимость от того же интерфейса:Override какого компонента реализация вводится для вложенных/транзитивных зависимостей
FooRepo
→IApiClient
BarRepo
→IApiClient
в этом случае IApiClient
осуществляется одним классом, GenericApiClient
, который знает, как общаться с любым API. Тем не менее, я хочу, чтобы создать различные экземпляры GenericApiClient
, которые передаются различные значения конфигурации (открытые с помощью IApiClientConfiguration
), так что FooRepo
разговаривает с API конечной Foo и BarRepo
разговаривает с Bar API конечной точки:
FooRepo
→IApiClient (GenericApiClient)
→IApiClientConfiguration (FooClientConfiguration)
BarRepo
→IApiClient (GenericApiClient)
→IApiClientConfiguration (BarClientConfiguration)
Вот что я пытался до сих пор:
container = new WindsorContainer();
container.Register(
Component.For<HomeController>().LifeStyle.Transient,
Component.For<FooRepo>()
.LifeStyle.Transient,
Component.For<BarRepo>()
//.DependsOn(Dependency.OnComponent<IApiClientConfiguration, BarClientConfiguration>()) // this does nothing cause the client config is not a direct dependency :(
.LifeStyle.Transient,
Component.For<IApiClient>()
.ImplementedBy<GenericApiClient>()
//.DependsOn(Dependency.OnComponent<IApiClientConfiguration, BarClientConfiguration>()) // this overrides for both FooRepo and BarRepo :(
.LifeStyle.Transient,
Component.For<IApiClientConfiguration>()
.ImplementedBy<FooClientConfiguration>()
.LifeStyle.Transient,
Component.For<IApiClientConfiguration>()
.ImplementedBy<BarClientConfiguration>()
.LifeStyle.Transient);
У меня возникли проблемы, выяснить, как получить FooRepo
, чтобы получить экземпляр GenericApiClient
сконфигурированный с FooClientConfiguration
с BarRepo
получать BarClientConfiguration
:
- По умолчанию они оба получают
FooClientConfiguration
, так это то, что зарегистрировано сначала - Я могу переопределить конфигурацию для
IApiClient
с использованиемDependsOn(...)
, но это относится как кFooRepo
, так и кBarRepo
- Если я использую
DependsOn(...)
наBarRepo
, это не имеет никакого эффекта
(В случае выше вопрос не ясно, у меня есть как минимум рабочего примера here)
Есть ли способ я могу настроить замок Виндзор делать то, что я хочу? Есть ли способ улучшить структуру моего кода, чтобы у меня не было этой проблемы?
Прохладный, это имеет смысл. Создайте различные именованные компоненты для 'IApiClient' и добавьте переопределение для каждой именованной версии. Интересно, есть ли способ сделать это, не называя компоненты «IApiClientConfiguration». Постскриптум Я должен был внести небольшое изменение, чтобы заставить ваш код работать ... надеюсь, вы не против, что я его отредактировал. –
Совсем нет. Я читал больше, потому что не хотел бы отказываться от надежды найти более простой способ. Но я ничего не понял. –
FYI [это упрощение] (https://github.com/mkropat/WindsorTransitiveDependencyOverrideMWE/commit/68fdab3c4621c26bd45636b108c4c4c0a65f1c06), похоже, работает на мой случай. –