7

特に DI/IoC と MEF に足を踏み入れています。

私は、環境全体へのアクセスを必要とするインターフェイスによって定義された 2 種類のパーツ (おそらくそれ以上) を持つ Web アプリケーションを持っています。アプリケーションには、MEF によって構成された各タイプの具体的な実装のリストがあります。

環境は次のもので構成されます。

  • いくつかのリポジトリ
  • 現在のアプリケーション リクエスト
  • レンダリング エンジン
  • ナビゲーションエンジン
  • 加えて、いくつかの静的ユーティリティ クラス

インターフェイス定義を別のアセンブリに配置し、同時に環境インジェクションを指定するにはどうすればよいですか?

明らかに、コントラクト アセンブリを参照する必要があり、循環参照を作成できないため、メイン アセンブリを参照することはできません。

環境クラスごとにインターフェイスを作成する必要があり、それらの公開されている型などを作成する必要があるようです...もっと良い方法があるはずです!

誰かが私にそれを指摘できれば、ここで明らかな大きな欠陥も見逃しているのではないでしょうか?

4

1 に答える 1

10

抽象化を実装から分離したい場合 (常に価値のある目標です)、それらの抽象化を独自のアセンブリで定義する必要があります。

実装側から見ると、抽象化を実装するには抽象化を参照する必要があるため、これは簡単に処理できます。MEF を使用するかどうかに関係なく、これを回避する方法はないため、これまでどおりです。

[Import(typeof(IFoo))]
public class MyFoo : IFoo { }

ただし、おっしゃる通り、これは抽象化ライブラリからコンポジション ルートを参照できないことを意味します。ただし、抽象化は構成方法を気にする必要がないため、これは当然のことです。

つまり、抽象化ライブラリの外部で依存関係の構成を実装する必要があります。その良い候補は実行可能ファイル自体ですが、すべての具体的な実装を 1 つまたは個別のライブラリに保持します。

抽象化ライブラリには参照がありませんが、消費者と実装者の両方がそれを参照する必要があるため、依存関係グラフは次のようになります。

Composition Root --> Abstractions <-- Implementations

矢印は参照を示します。

于 2010-03-02T10:23:14.693 に答える