依赖注入模式下设计的基本原则是什么
我对全 DI 模式的想法很陌生,并且我有一些基本的设计疑问。 我使用 Unity 应用程序块 2.0 作为我的 DI 框架。
对于问题:
- 假设我有一个名为 IDevice 的硬件设备接口。 以及一些接收此类 IDevice 的硬件侦听器。 现在假设您有多个实现 IDevice 的硬件设备和多个侦听器。 您需要为每个侦听器指定要注入的实际设备。 您不能只将单个设备映射到您需要诸如多重映射之类的接口。
一种可能的解决方案是为每个实际设备创建另一个抽象级别 像
public interface IActualDevice : IDevice { }
public class ActualDevice : IActualDevice { }
public class SimulatedActualDevice : IActualDevice { }
public class OtherAcualDevice : IOtherAcualDevice { }
这样就有可能创建这样的映射:
container.RegisterType<IActualDevice, ActualDevice>()
或者如果硬件丢失:
container.RegisterType<IActualDevice, SimulatedActualDevice>()
那么你认为这个好的设计是什么?
- DI模式给我们提供了良好的对象创建机制。
胶水怎么样,对象之间的事件订阅怎么样?
您不认为它丢失了,或者更好的是我缺少一些支持它的 Unity 功能。
I'm new to the all DI pattern idea and i have some basic design doubts.
im using Unity application blocks 2.0 as my DI framwork.
To the questions :
- Say I have an interface for HW devices named IDevice.
And some HW listener that receives such IDevice.
Now say you have several HW Devices that implement IDevice and Several Listeners.
You need to specify for each listener which actual device to inject.
You can’t just map a single device to the interface you need something like multiple mapping.
well one solution possible is to create another level of abstraction for each actual device
like
public interface IActualDevice : IDevice { }
public class ActualDevice : IActualDevice { }
public class SimulatedActualDevice : IActualDevice { }
public class OtherAcualDevice : IOtherAcualDevice { }
then it would be possible to create such kind of mapping :
container.RegisterType<IActualDevice, ActualDevice>()
or if the HW is missing :
container.RegisterType<IActualDevice, SimulatedActualDevice>()
so what do you say is this good design ?
- DI pattern gives us the good creation of objects mechanism.
What about glue, what about the event subscription between objects ?
don't you think it is missing or better am i missing some Unity feature that supports it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
无需引入标记接口来使您的 DI 容器正常工作 - 这将是泄漏抽象。
使用 Unity,您可以使用自己的 IDevice 实现来配置每个监听器,如下所示:
您现在可以像这样解析监听器:
一般来说,DI 的核心模式是构造函数注入和抽象工厂< /强>。大多数其他事情都是从这两件事开始的。有关更多 DI 模式和原则,请参阅此答案。
There's no need to introduce Marker Interfaces to make your DI Container work - that would be a Leaky Abstraction.
With Unity, you can configure each Listener with its own IDevice implementation like this:
You can now resolve the listeners like this:
In general, the core patterns of DI are Constructor Injection and Abstract Factory. Most other things follow from these two. See this answer for more DI patterns and principles.
1)这完全是个坏主意,因为接口旨在隐藏实现的细节。到处使用 IDevice 类型并手动注入此依赖项
如果您不想在代码中使用实现类名称,则使用命名注册:
2) 对象之间的事件订阅是对象初始化的一部分,但不是创建的一部分。 Unity只是封装了“新”运算符。在构造函数或特殊工厂中进行订阅,就像使用 DI 容器之前所做的那样。
1) This is totally bad idea, because interfaces are intended to hide details of implementation. Use IDevice type everywhere and inject this dependency manually
If you do not want to use implementation class names in code, then use named registrations:
2) Events subscription between objects is part of initialization of the object but not part of creation. Unity just encapsulates "new" operators. Make subscriptions in constructors or in special factories like you did before using DI container.