質問: DIコンテナを使用して動作の切り替えをしようとしています。 図としては以下のようなイメージで、**Mainプロジェクトのビルド時にはA.dllとB.dllのどちらを使用するか未確定のためアセンブリがロードされていないとき**に、DIコンテナの設定変更等でIBaseインターフェイスを実装するクラスがどれになるのか指定できるようにしたいです。 もちろん、注入候補となるクラスはBase.DLLのIBaseを実装していればいいので、DLLの候補は無数にあります。 前提として、Main.exe実行中にIBaseの実体が変更されることはありません。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/cda8f416b156324d2ea85a0f38b38bd8.png) ここで、以下質問があります。 1. **参照していないアセンブリを自動でロードする機能のあるDIコンテナってありますでしょうか?** 単純に、「アセンブリのDLLのパス」「そのDLLに含まれる、インジェクションする実体の型名(FullName)」「解決したいインターフェース名」が設定できれば十分だと思っているのですが、軽く調べただけだと見つかりませんでした。 2. **そもそもDIコンテナの使い方が合っていますか?** よくあるDIコンテナの実装例を見ると、(チュートリアルだからだと思いますが)ほとんどが同一プロジェクトや同一ファイル内のものを注入する例になっています。 図の例だと、普通はMainプロジェクトで注入される候補となるライブラリを静的参照したうえで設定ファイル変更により切り替えるんでしょうか? それとも、注入するクラス名およびDLLファイル名をA・Bの2プロジェクトで同一にしておくのが正しいやり方なんでしょうか?
回答: > > 1. **参照していないアセンブリを自動でロードする機能のあるDIコンテナってありますでしょうか?** > > > そのような機能を持つDIコンテナがあるのかはわかりませんが、`Assembly.LoadFrom`を使用して動的にDLLを読み込んだ上で、条件にあうクラスをDIコンテナに追加すれば目的の動作は可能です。 Assembly.LoadFrom メソッド > > 2. **そもそもDIコンテナの使い方が合っていますか?** > > > プロジェクトの要件によりけりだと思います。 例えばプラグインのような機能を持ったアプリケーションでは、所定のディレクトリ内のDLLに定義されているクラスのインスタンスをDIしたいということはあるでしょう。