0

科学機器と相互作用する.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番目のモジュールが同じインターフェース/具体的な実装を登録しようとするとフォールオーバーします!

4

3 に答える 3

0

名前付きインスタンスは問題ありません。DependsOn(Dependency.OnComponent("paramName", "serviceName"))流暢な構成のメソッドを介して、具体的な名前付きサービスへの依存関係を定義できます。

于 2012-09-24T07:20:27.590 に答える
0

プラグインのメタデータを提供することはできません。つまり、各プラグインの実装に、ウィンザーが必要な実装を識別するために使用できる名前属性を指定できますか?

私は最近Castleをあまり使用していませんが、名前付きのBindings / Registrationsの概念があったと確信しているので、それが不可能で他のメタデータがない場合は、それを区別する方法として使用できます。ウィンザーにとって曖昧さを少なくするために使用することを考えることができます、そして私はあなたの3番目のオプションを選ぶでしょう。

(上記を書いた後)2番目のオプションをもう一度読んだだけで、それが最良のオプションのようです。正確な構文を思い出せませんが、ほとんどのDIフレームワークでは次のようなことをします。

var instance = Get<IMyInterface>("Named This");

ドキュメントのどこかに構文例がたくさんありますが、登録するにはWindsor側で、要求するにはクライアント側で名前を知っている必要があります。

于 2012-09-21T10:51:40.190 に答える
0

私の見方では、いくつかの選択肢があります。私はあなたが2つの主要な問題を抱えていると思います。1つ目は、共有インターフェイスを2回(またはそれ以上)インストールすることです。2つ目は、共有インターフェイスの2つの異なるバージョンを使用できることです。

最初の問題では、共有インターフェイスを独自のアセンブリに分離します。そのアセンブリ内には、そのアセンブリを対象とするインストーラーがあります。次に、Windsorにその共有コンポーネントをインストールするように指示すると、Windsorはそれ自体を接続する方法を認識します。

2番目の問題については、2つのオプションがあります(私が見ているように)。最初のオプションは、共有コンポーネントの下位互換性を維持することです。2番目のオプションは、ランタイムを(アプリのドメインまたはプロセスを介して)分離することです。

于 2012-09-21T11:41:49.517 に答える