我是全 DI 模式想法的新手,我有一些基本的设计疑虑。 我使用 Unity 应用程序 block 2.0 作为我的 DI 框架。
问题:
- 假设我有一个名为 IDevice 的硬件设备接口(interface)。 还有一些接收此类 IDevice 的 HW 监听器。 现在假设您有多个实现 IDevice 和多个监听器的 HW 设备。 您需要为每个监听器指定要注入(inject)的实际设备。 您不能只将单个设备映射到您需要多个映射之类的接口(interface)。
一个可能的解决方案是为每个实际设备创建另一个抽象级别 喜欢
public interface IActualDevice : IDevice
{}
public ActualDevice : IActualDevice
{}
public SimulatedActualDevice : IActualDevice
{}
public OtherAcualDevice: IOtherAcualDevice
{}
那么就可以创建这样一种映射:
container.RegisterType<IActualDevice, ActualDevice>()
或者如果硬件丢失:
container.RegisterType<IActualDevice, SimulatedActualDevice>()
那么你说这个设计怎么样?
- DI 模式为我们提供了良好的对象创建机制。
胶水呢,对象之间的事件订阅呢?
你不认为它丢失了,或者更好的是我缺少一些支持它的 Unity 功能。
阿迪尔。
最佳答案
无需引入标记接口(interface)即可让您的 DI 容器正常工作 - 那将是一个泄漏抽象。
使用 Unity,您可以使用自己的 IDevice 实现配置每个 Listener,如下所示:
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的核心模式是Constructor Injection和Abstract Factory。大多数其他事情都来自这两个。参见 this answer更多 DI 模式和原则。
关于c# - 依赖注入(inject)模式下设计的基本原则是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3254583/