c# - 依赖注入(inject)模式下设计的基本原则是什么

标签 c# design-patterns dependency-injection unity-container

我是全 DI 模式想法的新手,我有一些基本的设计疑虑。 我使用 Unity 应用程序 block 2.0 作为我的 DI 框架。

问题:

  1. 假设我有一个名为 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>()

那么你说这个设计怎么样?

  1. 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 InjectionAbstract Factory。大多数其他事情都来自这两个。参见 this answer更多 DI 模式和原则。

关于c# - 依赖注入(inject)模式下设计的基本原则是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3254583/

相关文章:

java - 如何将包含 return 语句的代码块制作成函数?

c# - 是否可以从现有 DLL 中阻止消息框?

c# - 新手玩最好避免的事情;将连接实例添加到单例模式中

c# - 在 unix 时间戳中小数点后应该有数字吗?

.net - 为什么要密封单例类?

java - 为什么我们在发现 @Inject 方法时会遇到 StackOverflowError ?

.net - 在 .NET 中管理依赖树的最佳方法是什么?

spring-boot - Flyway 6 JavaMigrations 与 Spring Beans 的 native 依赖注入(inject)

c# - 保存 excel 2003 文件

c# - ASP.NET MVC 中的 session 超时警告