2011-06-27 21 views
2

私はASP.Net MVC 3アプリケーションにStructureMapを実装しようとしています。私のアーキテクチャは、UI層が私のサービス層と交渉し、今度は私のビジネス層と交渉し、それが順番にリポジトリ層と会話するn層アプローチに従います。私はすべての層を流れるデータを表すデータコントラクトを持っています。StructureMap n層アプリケーション

私のUI層は、サービス層についてのみ知っている必要があります。私のUIは、リポジトリまたはデータ層の他に、ビジネスについて知っていても気にしてはいけません。各層はそれ自身のアセンブリであり、必要なインスタンスを挿入するコンストラクタ依存性注入を使用しています(つまり、ビジネスコンストラクタにビジネスオブジェクトを注入し、リポジトリオブジェクトをビジネスコンストラクタに注入しています)。

したがって、階層が別々のアセンブリにあり、構造マップが存在するUIアセンブリで下位層がわからない場合は、構造マップをどのように構成しますか?私は、サービス層の背後にあるすべての「下位の」層に対して、UI層の参照を作成することを嫌っています。私がそれをすると、UIが悪いデータベースと直接対話するという扉が開かれる可能性があります。

助けてください。

おかげ

トム

+0

試しましたか?私はそれがすべてのアセンブリを含める必要があるアプリのドメイン全体をスキャンすると信じています。私は間違っている可能性があります;) –

+0

@RexMあなたは間違っていません。 StructureMapは実際にすべてのアセンブリを見つけることができればそれを配線することができます。 –

答えて

2

そこに行ったことがあります。あなたとまったく同じ考え方をして、アセンブリ参照を避けるとすべてが解決されると考えました。私はあなたがビルドしたxcopy'ingビルドされたdllのものであなたがしようとしていることをすることさえできました。現実には、それはちょうどそれがあると考えられているよりも混乱させました。

事は - 参照自体は悪の根源ではありません。 It's fineは、最上位(UI)アセンブリからすべてを参照します。悪いコードはトラブルを引き起こすものです。

2

私はサービス層の後ろに座って、すべての「下位」階層に私のUI層での参照を作成するには消極的です。私がそれをすると、UIが悪いデータベースと直接対話するという扉が開かれる可能性があります。

あなたはDIコンテナが構成されている場所である最終ASP.NETアプリケーションに全て低い階層を参照すべきです。デプロイ時にすべてのアセンブリがbinフォルダになければなりません。そうしないと、アプリケーションは動作しません。

UIレイヤ(ASP.NETアプリケーション)はデータベースと直接通信しません。サービスを適切に抽象化した場合、サービス抽象化と言います。この抽象化は、DIをどのように構成したかに応じて、データストアに対話するレポジトリの抽象化と言います。

2

構造マップを使用して、チェーンの下に依存関係を完全に配線すると、実際に使用するすべてのアセンブリにアクセスする必要があります。

これは、UIが(これはおそらく最も簡単な解決策ですが)しかし、それらを参照するために持っていることを意味するものではありません

あなたは作ることができるあなたについて何も知らなくても、それが必要とするだけのインターフェイスが含まれているUIの参照アセンブリ

これは、あなたのUIがあなたのサービス層インターフェイスについて知っているだけであることを意味します。

しかし、あなたのアプリケーションが一緒に、それは実装が使用するサービスを知っている必要があり、実装が使用する必要があるすべての依存関係のどの実装を知っている必要があり、様々な部品のすべてを使用できるようにするための、およびそのすべての道にラインを下ろす。これはすべて1つの場所(私が考えるASP MVCアプリケーションのglobal.ashx)で行う必要があります。これは、コンテナまたは他の実装クラスへの参照が存在する必要がある唯一の場所です。

お客様アプリケーションは、すべての層を組み合わせたものです。あなたのUIだけではありません。

これらのアセンブリをまったく参照したくない場合はおそらく、おそらくアセンブリを動的にロードするxmlを介して構造マップを構成できます。私はそれについては確信していませんが、それは私が思うはずです。 Xmlの設定は面倒です。

あなたのサービスインターフェイスがあなたのUIコントローラに注入されている限り、かなり安全です。誰かがdb層のような参照されたdllの1つから新しい依存関係を使用するためには、そのインタフェースをコントローラに導入して構造マップで配線する必要があります。

関連する問題