2012-01-20 7 views

答えて

8

個人的には、コントローラや一般的なプレゼンテーション層にリポジトリが表示されるのが好きではありません。しかし、私はそれを何度も見てきましたが、DDDの文脈では何も問題はありません。

答えは、あなたのプロジェクトの大きさによって決まると思います。より複雑なプロジェクトでは、サービスレイヤが頻繁に使用されます。単純なMVC Webサイトは、リポジトリを直接使用するだけです。

+1

「コントローラにリポジトリが見えないのはなぜですか?」>コントローラとリポジトリの間に追加する理由と中間層を詳しく説明できますか? – guillaume31

+1

コントローラは非常に急速に肥大化する傾向があります。これの理由の1つは、開発者がコントローラにビジネスロジックを固執させるためです。ビジネスロジックは主にドメインレイヤーにのみ存在し、サービスレイヤーには存在する必要があります。コントローラーではなくリポジトリに存在します。あなたのコントローラで(アプリケーション)サービスを使用することでこれを避けることができます。たとえば、accountService.GetUserByEmail(email)またはcatalogueService.GetProductViewModelを呼び出します。あなたのコントローラーは快適でリーズナブルな状態を維持し、アプリケーションサービスはさまざまなリポジトリーとの調整を調整します。 – autonomatt

+3

リポジトリからオブジェクトを取得しただけであっても、ビジネスロジックを扱うわけではありません。ドメインレイヤーからオブジェクトを他のレイヤーで使用することはまさに*です。そして私は、単一行のuserRepository.GetUserByEmail(電子メール)がaccountService.GetUserByEmail(電子メール)以上にコントローラを拡張する方法を見ることができません。 – guillaume31

2

また、リポジトリを直接使用してドメインオブジェクトを取得することはできますか?あなたは間違いなくでき

。それはリポジトリの目標です。 SOAやWebサービスベースのアーキテクチャーの特定のコンテキストを除いて、そうでなければどんな種類のサービスを使うのだろうと思います。

+0

私がサービスをバイパスし、リポジトリから直接(例えばMVCコントローラ内の)ドメインエンティティを取得できるかどうかは、私の意図した質問でした。 – jgauffin

+0

私はそれを正しく得ました。答えはイエスです。あなたが元のDDDの本を見て、今や動きが人々を怖がらせるようであれば、普通で一般的です... – guillaume31

+0

私は怖がっていません。私はベストプラクティスが何であるかを知りたかっただけです。この本は9年前にリリースされて以来、1つか2つのことが起こったかもしれません。 – jgauffin

0

DDDの原則を使用して構造化された最初のプロジェクトを完了した後、私はアプリケーション層が利用できるドメインサービスとリポジトリの両方を持つことが有用であることを発見しました。

キーポイント:このアーキテクチャを使用している場合は、アプリケーションレイヤーがWCFサービスまたはWebサービスのコードである可能性があります。すべてがあなたの実装に依存します。実装に合っていれば、アプリケーションレイヤーはプレゼンテーションレイヤーと同じでもかまいません。したがって、contollersまたはWebフォームのコードレイヤーにアプリケーションレイヤーコードがあります。

リポジトリは、メモリ内のコレクションのように機能します。アプリケーションレイヤーには、古いコレクションを使用しているように見えるはずです。

ドメインサービスは、決して更新されず、処理される可能性がありますが、直接更新されない情報へのプロセッサまたはアクセサのように機能します。アプリケーションレイヤーには、古いWebサービスを使用しているように見えるはずです。実際に私はそれがデータベースキーとビジネスをカプセル化し作成した実装オブジェクトに型指定されたジェネリックコレクションから継承

リポジトリ

マイリポジトリ:言われて、私はいくつかの例を挙げて詳細に説明することを

一緒にモデル化する。このアプローチを使用して、私はそのような

BusinessObject this[int index]; 

としての私のインターフェイスでインデクサーを定義することができると私は、基になるコレクションのインデックスとデータのキーを検索しますセッターに基づいてビジネス・オブジェクトを返しますゲッターを持つことができます基になるコレクションから削除し、オブジェクトをデータベースに保存します。これは、例えば

IBusinessObjectRepository repository = new SqlBusinessObjectRepository(sqlString); 
BusinessObject obj = repository[0]; //Get first object in the list. 
//Make some changes to the business object by setting properties or calling methods to process business logic. 
repository[0] = obj; //Save the object back to the database. 

サービス

私は個別に編集するつもりはないエンティティと値オブジェクトのリストを取得するためにサービスを使用して、私の場合には、ある、アプリケーションコードは非常に簡単になります集約ルート上のメソッドを呼び出すときに使用可能な選択項目または値としてのみ使用されます。一般に、私はこの情報をWebサーバーにキャッシュします。これはドメインサービスの唯一の使用ではなく、私の例です。アプリケーション層コードは比較的単純なままです。結論として、またDDDの原理を理解することにより、アプリケーション層はサービスまたはリポジトリのいずれかからビジネスオブジェクトにアクセスできるはずです。それらの間の選択は、ドメインモデル内で最適なものにまで下がります。

関連する問題