1

IoCコンテナに頭を包み込もうとしています。このデザインパターンを深く掘り下げていくと、データコンテキストクラスをインスタンス化して使用し、破棄する前に、多数の抽象化レイヤー、インターフェイス、具象クラスに出くわしました。

私は前進を続けたいと思っていますが、解決方法がわからないいくつかの未解決の問題があり、いくつかの説明とガイダンスが必要です。

  1. 2つのプロジェクト(mvc webとefを含むデータレイヤー)を持つ一般的なWebアプリケーションで、依存関係リゾルバーが特定のインターフェイスを実装するリポジトリを期待している場合(将来いつでもリポジトリを切り替えることができます)、このインターフェイスはどこで定義されますか?データアクセスレイヤーがそれに依存するようになり、データアクセスレイヤーに常駐できないため、mvc Webプロジェクトでどのように定義できるかわかりません。その場合、mvcプロジェクトはdalに依存し、全体のポイントを見逃してしまいます。この演習の。では、両方のプロジェクトでそれを定義し、各プロジェクトに独自のコピーを参照させるという答えはありますか?..それも可能ですか?または、3番目のサービスレイヤープロジェクトを作成し、それに1つのインターフェイス宣言を貼り付けて、両方のプロジェクトにこれを参照させる必要がありますか?

  2. IProductRepository、IClientRepository、IProductService、IClientServiceなどのインターフェイスを備えたUnity IoCについて説明している記事をいくつか見てきました(これは、冒頭の段落で言及していたものです)。これらの各インスタンスがデータベース内のテーブルを参照することになっていると仮定して正しいですか?もしそうなら、私が50のテーブルを持っているとどうなりますか?すべてを切り離すためだけに、50個のリポジトリインターフェイスと50個のテーブル関連インターフェイスを作成する必要がありますか?また、POCOクラスでEFを使用すると、どのような影響がありますか?各POCOに独自の指定されたインターフェイスを実装させる必要がありますか?

ありがとう

4

2 に答える 2

0

理想的には、ソリューションをいくつかのプロジェクトに分割します。

インターフェイスが定義されているコントラクトプロジェクト、それらのインターフェイスの具体的なバージョンが実装されているdalがあります。

次に、MVCプロジェクトはコントラクトプロジェクトを参照して、タイプへの参照を処理します。

IOCコンテナーを使用して、binフォルダー内のアセンブリをスキャンし、コントローラーの依存関係の具体的な実装を見つけます。これは、dalをmvcプロジェクトのbinフォルダーにビルドすることを意味します。これは、binフォルダーに新しいdllを配置するだけで、他の実装にdalを切り替えることができることを意味します。

リポジトリとテーブルについては、ビジネス機能ごとにグループ化する傾向があります。したがって、ユーザーとその関連テーブルを管理するビジネス機能は、ユーザーリポジトリなどにありますが、それは個人的な好みのimoに依存します。

于 2013-03-25T11:58:31.303 に答える
0

プロジェクトを階層に分割する場合、データレイヤーがスタックのさらに上のプロジェクトに依存することを望まないのは正しいことです。一般に、これらの依存関係を単方向にする必要があります。実行していることを続行してインターフェイスをデータレイヤーに配置するか、リポジトリとサービスのインターフェイスを含むモデルコードを格納する新しいプロジェクトを作成することができます。データレイヤーはモデルコードに依存し、MVCレイヤーはデータレイヤーに依存します。

2番目の質問に対処するために、これがデザインの芸術の出番だと思います。エンティティとデータテーブルの間の1対1のマッピングは必ずしも必要ではありません。それが理にかなっていて、特にEntity Frameworkの助けを借りて管理できると思われる場合は、1対1のマッピングを進めてください。ただし、永続化レイヤーとドメインモデルレイヤーの責任は異なることに注意してください。永続層がドメインモデルを作成する作業を滞らせ始めたら、2つを分離するためにいくつかの作業を行う時が来ました。

さらに重要なのは、MVCプロジェクトに公開されるインターフェイス「ファサード」です。これらには、モデル層と永続層からのある程度の分離が必要になります。それらは、モデルの中心的な責任にまで蒸留する必要があります。ドメインモデルの複雑さでアプリケーション層を乱雑にしたくはありません。

于 2013-03-25T12:24:16.163 に答える