Укажите реализацию зависимости в параметре конструктора - PullRequest
0 голосов
/ 17 марта 2019

Предположим, у меня есть интерфейс IA, две реализации A1 и A2 и зависимый класс B, который зависит от IA.Две реализации одного и того же интерфейса в контейнере Windsor регистрируются следующим образом:

container.Register(Component.For<IA>()
    .ImplementedBy<A1>());
container.Register(Component.For<IA>()
    .ImplementedBy<A2>());

Есть ли способ указать, какую реализацию использовать внутри зависимого класса B?

Например, в Autofac я мог бы использовать KeyFilterAttribute так:

class B 
{
    ...
    public B([KeyFilter("A1")]IA a)
    {
        ...
    }
}

1 Ответ

1 голос
/ 18 марта 2019

Есть несколько способов добиться этого, и какой из них наиболее подходит, зависит от более широкого контекста.

  1. Если вы регистрируете компоненты один за другим, как в примере кода, о котором идет речь Windsor использует первый компонент, зарегистрированный по умолчанию для службы. Таким образом, внутри вашего B вы гарантированно получите услугу, реализованную A1.

  2. В явном виде вы можете принудительно установить компонент по умолчанию (также работает для регистрации по соглашению

.

container.Register(
   Component.For<IA>().ImplementedBy<A1>(),
   Component.For<IA>().ImplementedBy<A2>().IsDefault());
  1. Или, глядя на это с точки зрения потребляющего конца , вы можете настроить B для выбора либо A1, либо A2 независимо от значений по умолчанию (которые будут ближайшими к Autofac

.

container.Register(
   Component.For<B>()         
      .DependsOn(Dependency.OnComponent<IA, A1>))
...