当社の製品の 1 つは、多数の小さな Web アプリケーションと Windows サービス (別名コンポーネント) で構成されており、それぞれが異なるコンピューターに存在する可能性があります。そのうちの 1 つは、他のすべての構成ハブとして機能する WebForms プロジェクトです。
現在、コンポーネントの一般情報を公開する機能を設計しています。たとえば、次のような単純なインターフェイスを想像してください。
public interface IStatistics
{
Statistics GetStatistics();
}
この同じインターフェイスをすべてのコンポーネントで使用したいので、これは共通の共有アセンブリに集中しています。実装も最初は同じであるため、インターフェイスと並んで、この同じアセンブリにあります。
アイデアは、共通アセンブリの実装とインターフェイスの両方を使用して、各コンポーネントで Wcf サービスを公開することです。この実装では、ローカル マシン時間など、実行されている場所に応じてさまざまなものを返す環境クラスを使用します。
私がエレガントに解決したい問題は、同じインターフェイスを使用して、すべてのコンポーネントのすべての実装を Web フォームに渡す方法です。
現在Unityを使用していますが、他の DI ソリューションでも同じ問題に直面すると思います。この同じインターフェースの 5 つの実装 (コンポーネントごとに 1 つ) を注入し、それらをコンポーネントごとに区別できるようにしたいと考えています ( a Dictionary<Component, IStatistics>
、Component
は anと考えてくださいEnum
)。これが必要なのは、どのコンポーネントの情報を表示するかを選択するドロップダウンがページにあり、ページが正しい実装を呼び出して結果を取得するためです。
すべての実装に名前付き登録を使用して、それらを注入できることを知っています。残念ながら、これは私を次のように導きます:
- ページに 5 つの異なるパラメーターがあり、それぞれがコンポーネントを指しています。
- 各実装をコンテナに異なる名前で登録する
- ページ インジェクション メソッド用に、登録された各インターフェイスを正しい順序で指定するカスタム InjectionConstructor を使用して、コンテナーに Web フォームを明示的に登録します。
Unity には ResolveAll メソッドがあるため、IStatistics[]
またはを受け取ることができることは知ってIEnumerable<IStatistics>
いますが、それらを区別することはできません。
MEFは、メタデータ インターフェイスの概念によってこれを見事に解決すると思います。おそらく、これにMEFを使用することは、この問題を解決する方法でしょうか? これらは私たちが話している wcf プロキシであるため、ここでは不適切だと思います。これが MEF とどのように統合されるかはまったくわかりません。
ファクトリを使用する方がより良い戦略かもしれませんが、ファクトリにもサービスを注入する方法がわからないため、問題は解決しません。