1

つまり、リポジトリにメソッドがあるとしましょう。

Public Function GetCustomerByState(ByVal State As String) As IQueryable(Of Customer)

サービスがこの拡張機能の形式で追加データを取得して、顧客の注文を取得できるようにする必要があります。

<Extension()> _
    Public Function Include(Of T)(ByVal Source As IQueryable(Of T), ByVal Path As String) As IQueryable(Of T)
        Dim ObjectQuery = CType(Source, ObjectQuery(Of T))
        If (ObjectQuery IsNot Nothing) Then
            Return ObjectQuery.Include(Path)
        End If
        Return Source

    End Function

この拡張機能は、一般的なリポジトリで使用される可能性があります。

または、サービスに必要なものを正確に返し、多かれ少なかれ何も返さない、集約ルートごとのリポジトリの具体的な実装が必要ですか?

次に、リポジトリはIQueryableを返す必要がありますか?

4

2 に答える 2

2

私は次のような限られた方法のセットのみを提供します:

IQueryable<T> GetQuery();
T GetByKey(K key);

その理由は、リポジトリはアグリゲーションルートへのデータアクセスの抽象化を提供するために使用されますが、ビジネスロジックはどのデータを取得するかを定義する責任があるためです。リポジトリに渡すロジックが多すぎると、サービスとリポジトリの間でロジックが分割されます。さらに、サービス中のほとんどのデータ取得メソッドは何もしません。リポジトリメソッドを呼び出すだけです。

マーティンファウラーはこれを明確に言います:

リポジトリは、ドメインとデータマッピングレイヤーの間を仲介し、メモリ内のドメインオブジェクトコレクションのように機能します。クライアントオブジェクトは、宣言的にクエリ仕様を作成し、満足のためにリポジトリに送信します。

過去数年間、リポジトリとUnitOfWorkパターンは.NETの世界で非常に人気がありました。しかし、このファミリの3番目のパターンである仕様については誰も話しません。仕様は、返されるデータを定義するためにリポジトリに渡される抽象化されたクエリです。IMO Linq-To-Entitiesクエリは仕様であるため、.NETworldはこのパターンを明示的に使用しません。

于 2011-03-08T07:30:23.387 に答える
1

サービスに必要なすべてのものをリポジトリから返します。これは良い習慣であり、重複するクエリを作成する可能性を防ぎます。私は、EFコードファーストを使用してリポジトリにSOの回答を書きました。これは、次のことに役立ちます。Entity Framework 4 CTP 4 /CTP5汎用リポジトリパターンとユニットテスト可能

注意点-リポジトリパターンにはさまざまな実装があり、「正しい」と感じるソリューションを見つけることをお勧めします。小さなプロジェクトではIQueryableを返すことができますが、それが大きくなると、物事を乾いた状態に保つことが難しくなるため、設計上の決定を後悔する可能性があります。

于 2011-03-08T05:33:05.720 に答える