3

我一直在使用与硬件抽象相关的依赖注入。所以,基本上我有一些我想从 C# 应用程序中控制的硬件设备。这些设备通常有一个根设备,用于访问叶设备。结构非常简单:LeafDevice1 和 2 通过 Interface1 连接到 RootDevice1,LeafDevice3 连接到 RootDevice2,依此类推。

现在我想我可以通过依赖注入来解决这个问题,因为“叶子”设备通常不关心它们是如何连接的,只要它们连接到指定的接口。但我想知道使用 IOC 容器的依赖注入是否实际上是最好的方法。我怀疑的主要原因是:我一直使用命名依赖项。如果我将设备 B 和 C 连接到根设备,AI 想确保它们指的是完全相同的设备。另外,我使用了很多单例范围,因为命名的依赖 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 来与实际的硬件设备进行通信。Root Device 提供了多个 BusMaster,可用于与所述叶设备进行通信。

提前致谢

4

1 回答 1

1

By my experience it worth to use a DI container just for its singleton scoped instance creation, in case you are using singleton and/or lightweight pattern heavily in your application.

Do not reinvent the wheel, and do not repeat yourself both satisfied then.

The only consideration would be the performance. If using a DI container fits to the performance specification / expectation then use it! They are well tested, much more professional and stable what you could write from scratch.

于 2015-06-25T13:16:52.223 回答