2011-07-28 4 views
4

私は、WindowsアプリケーションプロジェクトでStructureMapを使い始めています。基本の学習に取り組んで、私は同じ目標を達成するために私のソリューションを手配する2つの方法を見つけました。そして、私はこれらの2つのうちの1つがより良いオプションのように思えると誰かがコメントできるかどうか、なぜですか?StructureMapを使用すると、これらのプロジェクト組織のうちの1つが他の組織より優れていますか?

ここでの目標は、IOCを使用して2つのサービスを依存関係なく使用できるようにすることでした。そこで私は自分のビジネスレイヤーにインターフェイスを作成し、インフラストラクチャプロジェクトでこれらのインターフェイスを実装し、その時点で実際のサービスをラップしました。

私はこれを最初に試してみましたが、流暢なインターフェイスを使って構造マップを初期化するコードを持つDependencyResolverプロジェクトを作成しました(IServiceAが必要なときにServiceXのインスタンスを与えます)。 DependencyResolverの初期化が私のアプリからキックオフする必要があるので、私はこのようなアプリからDependencyResolverへの参照があります。

First attempt. Strongly typed StructureMap initialization. App has indirect references to everything because of it's reference to DependencyResolver

をそれでは、私はDependencyResolverに私の参照を削除し、頼ることができることを見出しましたStructureMapスキャナと命名規則は、実行時にその参照を取得するには、それでは私のセットアップは次のようになります。それでは

App now uses StructureMap directly to instantiate the class in DependencyResolver at runtime, and from there DependencyResolver sets up the remaining stuff just like in the earlier version.

、私がダウンして、私が使っていたサービスに、さらなる命名規則を取って、でしたできるDependencyResolverを一括して削除します。この時点で、私は全くのStructureMapスキャナに頼ると、正しく物事の設定を取得するために命名規則います:

enter image description here

Soがここで私は、これらの3つの選択肢についてどのように感じるべきかについてはっきりしていません。オプション1は、UIをそのまま間接的に参照するべきではないことを除いて、(直接)StructureMapの使用のために参照する必要があります。しかし、私はこのが本当にであるかどうか分からない。

オプション2は、DependencyResolverへの参照の必要性をなくし、そのプロジェクトのクラスにアクセスするための命名規則に依存していますが、残りのすべての設定を高いレベルで制御できます(ただし、私のアプリケーションから直接structureMapへの依存)。

オプション3は最も簡単です(名前はすべて特定の方法で、アセンブリをスキャンします)が、エラーが発生しやすく、脆いようです。特に、私はIServiceAbc => ServiceAbcよりも少し複雑なことをしたいと思っていました。

だから、このようなことを経験したことがある人なら、助けてもらえますか?
私のアプリケーションから私のサービスへの間接参照を避けるべきでしょうか?あれば、そうすることの本当のメリットは何ですか? 名前付け規則ですべてをやろうとしているのは、単純なプロジェクトでは賢明なことですか?
私がここでやろうとしていることを行うための標準的なパターンはありますか?

長い記事のために申し訳ありません

..

答えて

4

Composition RootでStructureMapのすべての使用をカプセル化し、残りのコードベースでコンストラクタ注入を使用します。

Composition Rootは、必要に応じて別のアセンブリに実装できますが、通常は実行可能ファイル自体に直接配置し、すべてのアプリケーションロジックを別々のライブラリに実装することをお勧めします。

+0

私はそれをアプリケーションに入れておけば、私のアプリはプロジェクトのすべてのアセンブリを参照する必要があります(それらのアセンブリにアクセスするために使用されたすべてのコードがインタフェースを介して行われたとしても)コンテナ。それは理想よりも少なく見えないのですか?多分それは問題ではないかもしれませんが、アプリとドメイン/ビジネス層に第三者サービスへの参照がないようにする方が良いようです。 – chrismay

+1

そのため、ドメインモデルを別のアセンブリに配置する必要があります。 –

+1

このアーキテクチャの分離は、より精巧にする必要があります –

1

私はプロジェクトのトップデザインを使用して、それは非常にうまく機能します。

依存関係リゾルバは、インタフェースインスタンスを返すファクトリですが、これを実装するための構造マップではありませんか?その場合、依存関係リゾルバを介して1つの中心的な場所でアイテムをリクエストします。次に、構造マップを削除し、別のサービスロケータ(unity、castle windsorなど)を追加して、アプリに関する他の情報を変更することもできます。

3番目のオプションのUIプロジェクト(UIプロジェクトをスワップアウトして別のものを入れるとどうなりますか)だけでなく、2番目のオプションの2つの場所から依存関係を解決する必要はありません。

関連する問題