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 に依存して実際のハードウェア デバイスと通信します。ルート デバイスは、前述のリーフ デバイスとの通信に使用できる複数の BusMaster を提供します。

前もって感謝します

4

1 に答える 1