使用依赖注入进行硬件抽象
本文关键字:硬件 抽象 注入 依赖 | 更新日期: 2023-09-27 17:59:36
我一直在玩与硬件抽象相关的依赖注入。所以,基本上我有一些硬件设备,我想从C#应用程序中控制它们。这些设备通常具有用于访问叶设备的根设备。结构非常简单:LeafDevice1&2通过接口1连接到RootDevice1,LeafDevice3连接到RootDevice 2等等。
现在我想我可以通过依赖注入来解决这个问题,因为"叶子"设备通常不在乎它们是如何连接的,只要它们连接到指定的接口。但我想知道使用IOC容器的依赖注入是否真的是最好的方法。我怀疑的主要原因是:我一直使用命名依赖项。如果我将设备B和C连接到根设备A,我想确保它们指的是完全相同的设备。此外,我使用了很多单例作用域,因为命名的依赖项xyz应该只存在一次。
因此,在我的情况下,配置容器意味着将许多命名的依赖项粘合在一起。
据我所知,当您想指定要注入哪个实现时,使用IOC容器是最有意义的。但据我所见,我正在使用容器来管理在哪里使用哪个特定对象。当然,所述对象的实际实现可能有所不同,但它更多的是一个"在哪里使用什么?"问题,而不是"使用哪个实现"问题。
建立一个类似设备树的东西,我可以用来访问我的设备,这不是更好吗?
Bind<RootDevice>().ToConstructor<RootDevice>(e => new RootDevice(serialNumber))
.InSingletonScope().Named("ConcreteRootDevice");
Bind<IBusMaster>().ToMethod<IBusMaster>(e => e.Kernel.Get<RootDevice>("ConcreteRootDevice")
.GetBusMaster(0)).Named("ConcreteBus1");
Bind<IBusMaster>().ToMethod<IBusMaster>(e => e.Kernel.Get<RootDevice>("ConcreteRootDevice")
.GetBusMaster(1)).Named("ConcreteBus2");
Bind<IBusMaster>().ToMethod<IBusMaster>(e => e.Kernel.Get<RootDevice>("ConcreteRootDevice")
.GetBusMaster(2)).Named("ConcreteBus3");
Bind<IBusMaster>().ToMethod<IBusMaster>(e => e.Kernel.Get<RootDevice>("ConcreteRootDevice")
.GetBusMaster(3)).Named("ConcreteBus4");
Bind<LeafDevice>().ToConstructor<LeafDevice>(o =>
new LeafDevice(o.Context.Kernel.Get<IBusInterface>("ConcreteBus1")))
.Named("ConcreteLeafDevice1");
Bind<LeafDevice>().ToConstructor<LeafDevice>(o =>
new LeafDevice(o.Context.Kernel.Get<IBusInterface>("ConcreteBus1")))
.Named("ConcreteLeafDevice2");
Bind<LeafDevice>().ToConstructor<LeafDevice>(o =>
new LeafDevice(o.Context.Kernel.Get<IBusInterface>("ConcreteBus2")))
.Named("ConcreteLeafDevice3");
在此示例中,LeafDevices将依赖于抽象IBusInterface与实际硬件设备进行通信。根设备提供多个总线主机,这些总线主机可用于与所述叶设备通信。
提前感谢
根据我的经验,如果您在应用程序中大量使用singleton和/或轻量级模式,那么仅将DI容器用于其singleton范围的实例创建是值得的。
不要重新发明轮子,不要重复自己两人都满意。
唯一的考虑因素是表现。如果使用DI容器符合性能规范/期望,那么就使用它!它们经过了很好的测试,更加专业和稳定,你可以从头开始写。