3

先日、こんな質問をしました。

リポジトリ層はデータ転送オブジェクト (DTO) を返す必要がありますか?

答えは (たった 1 人によるものですが、それは良い考えではないという予感が既にありました)、いいえ、リポジトリは後で DTO オブジェクトを処理する必要はないというものでした (それらの目的は純粋にサーバー経由で送信されることです)。ワイヤー) であり、サービス層がそれを処理する必要があります。

今、私はその間にあなたの意見が必要な構造を思いついた. その考えは、そうするのが理にかなっている場合、リポジトリ層は、私が定義した と呼ばれるインターフェースタイプを返すことができるということIProjectableです。これはクエリをラップします(リポジトリレイヤーはまだクエリを実行しません)が、消費者がクエリを変更することはできません(それはそうではありません)IQueryable。実際にクエリを実行します。FirstToPagedList

したがって、リポジトリでは次のようになります。

public IProjectable<User> GetUser(int id)
{
  var query = from u in Set<User>()
              where u.UserID == id
              select u;

  return query.AsProjectable();
}

そして、サービス層では次のようになります:

var dto = repository.GetUser(16).Single(u => new SimpleUserDto
{
  FullName = u.FirstName + " " + u.LastName,
  DisplayAddress = u.Address.Street + u.Address.HouseNumber,
  OrderCount = u.Orders.Count()
});

return dto;

ここで実際のデータアクセスを行うことは、依然としてリポジトリレイヤーの責任であり(そうあるべきです)、シリアライズ可能なフォームへの射影はサービスレイヤーの責任である(そうあるべきである)というのは正しいですか?

これを効率的に行うための他の唯一の方法(Userリポジトリからa を返しCount()Ordersサービス層でこれを実行すると、データベースへの余分なクエリが発生します) は、これらすべてのプロパティを持つ型を定義し、これは、「純粋さ」のために同じ名前を付けていないだけで DTO と同じであるため、ばかげているように思えます。このようにして、私は自分のケーキを持って、ほとんどの場合それを食べることができるようです.

私が見る欠点は、サービスレイヤーが実際にSQLに変換できないプロジェクションを実行する場所で不一致が発生する可能性があることです。これは心配する必要はありません.実際のデータアクセスを行います。

ところで、私は Entity Framework 4 を使用しています。

4

2 に答える 2

0

ここで実際のデータアクセスを行うことは依然としてリポジトリレイヤーの責任であり(あるべき姿)、シリアル化可能なフォームへのプロジェクションはサービスレイヤーの責任である(あるべき姿)と言っているのは正しいですか?

はい、そうです。サービスレイヤーは、実際のDataAccessがどのように実行されているかをまだ認識していません(そうではないはずです)。呼び出しはSQLに送信されますか?間にキャッシングレイヤーがありますか?

私が見る欠点は、サービスレイヤーが、実際には心配する必要のないSQLに変換できないプロジェクションを実行する場合、またはレイヤーが何であるかを疑わせるような複雑なプロジェクションを実行する場合に、不一致が発生する可能性があることです。実際のデータアクセスを行います。

この問題では、パイプラインパターンを使用します。これは、基本的に、テスト済みのプロジェクションを実行できるIProjectableの拡張メソッドのセットです。次に、serviceLayerで、これらのパイプラインメソッドの組み合わせを使用してクエリを記述できます。次に例を示します。

var users = repository.GetUsers()。FilterByName( "Polity")。OrderByAge()。ToTransferObjects();

于 2011-03-10T17:36:40.670 に答える
0

私が最も尊敬している開発者の1人であるayende(http://ayende.com/Blog/Default.aspx)は、次のように述べています。 2011/03/09 /interview-with-ayende-rahien-aka-oren-eini.aspx

質問は、本当にリポジトリパターンが必要ですか?ただ私の意見:)

于 2011-03-10T18:59:28.757 に答える