我一直在玩与依赖注入有关的硬件抽象。所以,基本上我有一些硬件设备,我想从C#应用程序中进行控制。这些设备通常具有用于访问叶设备的根设备。结构非常简单:LeafDevice1 & 2通过Interface1连接到RootDevice1,LeafDevice3连接到RootDevice2等等。使用依赖注入进行硬件抽象
现在我想我可以用依赖注入来解决这个问题,因为“叶”设备通常不关心它们如何连接,只要它们连接到指定的接口。但我想知道使用IOC容器进行依赖注入是否是实现它的最佳方式。我怀疑的主要原因是: 我使用命名依赖关系ALL THE TIME。如果我将设备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来与实际的硬件设备进行通信。根设备提供了几个可用于与所述叶设备通信的总线主控器。
在此先感谢
依赖注入不是关于工具:它是关于应用模式和原则,如依赖倒置原则。 IoC容器不是必需品,尽管它们可能有用。有可能使用IoC容器不会有帮助。在这种情况下,不要使用它!用手连接你的依赖关系(当然使用构造器注入)。 – Steven