DryIoc: регистрация с другой зависимостью зависимости

Как я могу переопределить зависимость зависимости в операторе регистрации?

Например:

class A {
  public A(IB b) {}
}

class MyService {
  public MyService(A a) {}
}

cnt.Register<MyService>(made: Parameters.Of.Type<IB>(serviceKey: "otherIB")); // ignored by dryioc, because it's a Dependency of Dependency A
cnt.Register<IB, OtherB>(serviceKey: "otherIB");

Я думаю, что это простой вопрос, если потребуется другое объяснение, я отредактирую вопрос.


person user2429841    schedule 16.11.2017    source источник


Ответы (1)


Зависимость от зависимости — это вложенная вещь, которая не видна первому владельцу зависимости. В противном случае это нарушит изоляцию - зачем мне знать о деталях реализации моих зависимостей (их зависимостях)?

Для исправления кода необходимо добавить регистрацию для A:

cnt.Register<MyService>();
cnt.Register<A>(made: Parameters.Of.Type<IB>(serviceKey: "otherIB"));
cnt.Register<IB, OtherB>(serviceKey: "otherIB");

Обновлять:

С другой стороны, если вам нужна зависимость на основе контекста, вы можете зарегистрировать ее с условием:

cnt.Register<IB, OtherB>(setup: Setup.With(condition:
    req => req.Parent.Enumerate().Any(p => p.ServiceType == typeof(MyService)));

cnt.Register<IB, DefaultB>(setup: Setup.With(condition:
    req => req.Parent.Enumerate().All(p => p.ServiceType != typeof(MyService)));
person dadhi    schedule 17.11.2017
comment
Мой код был просто примером для демонстрации варианта использования. Если мне нужен другой настроенный IB для экземпляра A только для MyService и IB по умолчанию для экземпляра A по умолчанию для всех моих других служб-реализации (ожидайте MyService), мне нужно настроить другую регистрацию для A. Это дублирование кода, которое я хотел предотвращать. - person user2429841; 17.11.2017
comment
Я обновил свой ответ примером регистрации на основе контекста. - person dadhi; 18.11.2017