DryIoc - указание зависимости при использовании внедрения конструктора

Использование DryIoc, если я регистрирую две реализации одного и того же контракта - как можно контролировать, какую реализацию использовать при использовании внедрения конструктора?

Я вижу, вы можете зарегистрироваться с помощью ключа или метаданных - возможно ли (с помощью атрибута?) Управлять внедрением внедрения? Или мне нужно собрать коллекцию и выяснить правильную реализацию в ctor?


person Keir    schedule 10.03.2016    source источник


Ответы (1)


Вы можете указать, какую зависимость использовать в конструкторе с помощью строго типизированной спецификации Made.Of, например:

container.Register<SomeClient>(Made.Of(
   () => new SomeClient(Arg.Of<IDep>("service key of impl")));

Вот соответствующий ответ SO с дополнительными параметрами.

Приписанная регистрация поддерживается с помощью модели с атрибутами MEF:

[Export]
public class SomeClient {
    public SomeClient([Import("x")]IDep dep) {}
}

[Export("x", typeof(IDep))]
public class X : IDep {}

[Export("y", typeof(IDep))]
public class Y : IDep {}

// in composition root:
using DryIoc.MefAttributedModel;

container = new Container().WithMefAttributedModel();

container.RegisterExports(
    typeof(SomeClient),
    typeof(X),
    typeof(Y));

container.Resolve<SomeClient>(); // will inject X
person dadhi    schedule 10.03.2016