2015-06-25 41 views
3

我一直在玩與依賴注入有關的硬件抽象。所以,基本上我有一些硬件設備,我想從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來與實際的硬件設備進行通信。根設備提供了幾個可用於與所述葉設備通信的總線主控器。

在此先感謝

+2

依賴注入不是關於工具:它是關於應用模式和原則,如依賴倒置原則。 IoC容器不是必需品,儘管它們可能有用。有可能使用IoC容器不會有幫助。在這種情況下,不要使用它!用手連接你的依賴關係(當然使用構造器注入)。 – Steven

回答

1

通過我的經驗是值得使用DI容器只是其單範圍的實例創建,如果你在你的應用程序中使用單和/或輕模式嚴重。

不要重新發明輪不要重複自己都滿意然後。

唯一的考慮是性能。如果使用DI容器符合性能規格/期望值,請使用它!它們經過很好的測試,更專業,更穩定,可以從頭開始編寫。