What are the basic principles for designing an Injection Dependency pattern?

I am new to the whole idea of ​​the DI template, and I have some basic design doubts. im using Unity 2.0 application blocks as a DI framework.

To the questions:

  • Say I have an interface for HW devices called IDevice. And some HW listener that gets such an IDevice. Now say that you have several HW devices that implement IDevice and several listeners. For each listener, it is necessary to indicate a specific device for injection. You cannot just map one device to an interface, you need something like multiple matching.

Well, one of the possible solutions is to create another level of abstraction for each actual device as

public interface IActualDevice : IDevice
{}

public ActualDevice : IActualDevice
{}

public SimulatedActualDevice : IActualDevice
{}

public OtherAcualDevice: IOtherAcualDevice
{}

:

container.RegisterType<IActualDevice, ActualDevice>()

HW:

container.RegisterType<IActualDevice, SimulatedActualDevice>()

, , ?

  1. DI .

, ?

, , Unity, .

Adiel.

+3
2

Marker DI - Leaky Abstraction.

Unity IDevice :

container.RegisterType<IDevice, ActualDevice>("actual");
container.RegisterType<IDevice, OtherActualDevice>("otherActual");

container.RegisterType<IListener, Listener1>("listener1",
    new InjectionConstructor(
        new ResolvedParameter<IDevice>("actual")));
container.RegisterType<IListener, Listener2>("listener2",
    new InjectionConstructor(
        new ResolvedParameter<IDevice>("otherActual")));

, :

var listener1 = container.Resolve<IListener>("listener1");
var listener2 = container.Resolve<IListener>("listener2");

DI Factory. . . DI.

+2

1) , . IDevice

IDevice d;

if(a == 1)
{
   d = container.Resolve<SimulatedActualDevice>()
}
else
{
   d = container.Resolve<ActualDevice>()
}

User user = container.Resolve<IUser>();
user.Device = d;

, :

IDevice d;

if(a == 1)
{
   d = container.Resolve<IDevice>("Simulated")
}
else
{
   d = container.Resolve<IDevice>("Actual")
}

User user = container.Resolve<IUser>();
user.Device = d;

2) , . Unity "" . , DI.

-2

Source: https://habr.com/ru/post/1754786/


All Articles