DataMappersを使用してDDDでページ付けをどのように実装する必要がありますか?オブジェクトRangeとOrderを作成してfindメソッドに渡すことを考えましたが、この場合のページ付けはUIとパフォーマンスの問題であり、モデルを表す問題ではないため、それが良い解決策かどうかはわかりません。 CQRS( http://martinfowler.com/bliki/CQRS.html )についても読みましたが、私が作業しているモデルは、Queryとコマンド。
皆さんはどう思いますか?
一般に、@ RobertHarveyと上記の答えに同意します。リポジトリのようなエンティティがある場合は、それらを拡張して、UIのニーズに対応するサポートを提供します。
ただし、具体的には次のとおりです。
DataMappersを使用してDDDでページ分割をどのように実装する必要がありますか?
ビジネスドメインで問題をモデル化したい場合は、基本的なフィルタリング、並べ替えなどを提供するReport
エンティティを検討できます。レポートは一般的なビジネスエンティティです。基幹業務システムの最も基本的なUIビューは、単純なレポートと見なすことができ、インタラクティブな場合もあります。
レポートがどのようにフォーマットされるかは、UIの問題、またはスマートUIによって自動的に処理されるReportFormat
ドメインエンティティと考えることができます。状況に応じて、これは大幅な過剰設計になるか、かなり実用的になる可能性があります。たとえば、UI全体がSSRSによって駆動されるシステムで作業しました。
C#を使用している場合、Report
エンティティのデータ選択の側面は、EFにパススルーできるLINQ式ツリーとして実装できます。
必要なページネーションデータを定義するページネーションオブジェクトをいくつか追加するだけです。たとえば、次のC#コードを考えてみます。
public class OffsetPagination
{
public int PageNumber; //0
public int RowsPerPage = 10;
}
public class KeySetPagination
{
public Int64 FirstKey = -1;
public Int64 LastKey = -1;
public Boolean Next = true;
public int RowsPerPage = 10;
}
次に、それらをクエリオブジェクトの一部として渡します。そこから、ページ分割をサポートするクエリを作成するだけです。たとえば、次のSQL Serverストアドプロシージャを考えてみます。
CREATE PROCEDURE [dbo].[SampleOffsetPaging]
@PageNumber INT,
@RowsPerPage INT
AS
BEGIN
SET NOCOUNT ON;
SELECT [Id],[Name],[Created] from SampleTable
ORDER BY Id
OFFSET @PageNumber*@RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY
END
クライアントは、どのページにあるかを追跡し、必要に応じてそれを渡します。 @Robertが示したように、ドメインモデルはクエリを制御するためにデータ層で使用されるため、ドメインモデルにはまったく影響しません。これは、クエリの一部としてページングを管理するためのほんの少しの追加情報です。
どのテクノロジースタックを使用しているかはわかりませんが、ここで示した概念は同様に適用できます。