dryioc

DryIoc - specifying dependency when using constructor injection


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?


Solution

  • 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