1

Using DryIoc if I register two implementations of the same contract - how can control which implementation to use when using constructor injection?

I see you can you register with a key or metadata - is it possible (using an attribute?) to control with implementation is injected? Or should I require a collection and figure out the correct implementation in the ctor?

Keir
  • 483
  • 3
  • 10

1 Answers1

1

You can specify what dependency to consume in constructor via Made.Of strongly-typed spec, like so:

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

Here is the related SO answer with more options.

Attributed registration is supported via MEF Attributed Model:

[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
dadhi
  • 4,807
  • 19
  • 25