科学機器と相互作用する.Netデスクトップアプリを開発しています。この機器にはさまざまなバリエーションがあり、それぞれが異なる機能やコンポーネントなどを備えているため、「モジュールアセンブリ」に必要なすべてのビジネスロジック、UIなどが含まれるプラグイン/モジュラーアーキテクチャを考え出しました。そのハードウェアコンポーネント/機能と対話します。
現在、すべてを含む1つのソリューションがあります。「コア」アプリケーションプロジェクト、共通ライブラリ、および「モジュール」プロジェクトです。アイデアは、(必要なDLLを選択するのではなく)顧客サイトにロット全体をインストールし、必要なモジュールのリストを含む構成ファイルを使用して、関連するモジュールを「アクティブ化」することです。
メインアプリケーションプロジェクトは、Castle Windsorを使用し、AssemblyFilterとカスタムInstallerFactoryを使用してモジュールをロードします。各モジュールアセンブリを検索して、特定のカスタム属性(モジュール名を含むプロパティを持つ)を実装IWindsorInstaller
および装飾したクラスを探します。モジュールのインストーラーは、属性のモジュール名が要求されたものの1つである場合にのみ実行されます。これらのインストーラークラスは、そのモジュールに必要なすべてのもの(ビジネスロジック、ビュー、ビューモデルなど)をWindsorに登録する役割を果たします。
このソリューションは、私の概念実証では問題なく機能しますが、2つ以上のモジュールが機能的に非常に類似しているため、共通のコードを共有する必要があるシナリオを見ることができます。プロジェクト「ModuleA」と「ModuleB」があり、それらのWindsorインストーラーIFooService
がプロジェクト「ClassLibraryX」に同じクラスを登録するとします。IFooServiceが2回再登録されたため、アプリはフォールオーバーし、Windsorは、コンストラクターから要求されたときにどちらを解決するかを認識しません。
これを処理するための最良の方法は何ですか?これまでの考え:-
- 特定のコンポーネントがすでにWindsorに登録されているかどうかを確認します。これはハッキーだと感じます(可能であれば)
- 名前を使用してコンポーネントを登録しますが、コンストラクターインジェクションを使用して名前付きインスタンスをリクエストするにはどうすればよいですか?
- 各モジュールプロジェクトで、などの新しいインターフェイスを作成し
public interface IModuleAFooService : IFooService
、プロジェクト全体で(ではなくIFooService
)これを登録/使用します。
何かご意見は?
編集:実際、ウィンザーは解決しようとしても倒れませんIFooService
。2番目のモジュールが同じインターフェース/具体的な実装を登録しようとするとフォールオーバーします!