web-dev-qa-db-ja.com

データマッパーを使用してDDDにページネーションを実装する

DataMappersを使用してDDDでページ付けをどのように実装する必要がありますか?オブジェクトRangeとOrderを作成してfindメソッドに渡すことを考えましたが、この場合のページ付けはUIとパフォーマンスの問題であり、モデルを表す問題ではないため、それが良い解決策かどうかはわかりません。 CQRS( http://martinfowler.com/bliki/CQRS.html )についても読みましたが、私が作業しているモデルは、Queryとコマンド。

皆さんはどう思いますか?

3
Lucas Piske

一般に、@ RobertHarveyと上記の答えに同意します。リポジトリのようなエンティティがある場合は、それらを拡張して、UIのニーズに対応するサポートを提供します。

ただし、具体的には次のとおりです。

DataMappersを使用してDDDでページ分割をどのように実装する必要がありますか?

ビジネスドメインで問題をモデル化したい場合は、基本的なフィルタリング、並べ替えなどを提供するReportエンティティを検討できます。レポートは一般的なビジネスエンティティです。基幹業務システムの最も基本的なUIビューは、単純なレポートと見なすことができ、インタラクティブな場合もあります。

レポートがどのようにフォーマットされるかは、UIの問題、またはスマートUIによって自動的に処理されるReportFormatドメインエンティティと考えることができます。状況に応じて、これは大幅な過剰設計になるか、かなり実用的になる可能性があります。たとえば、UI全体がSSRSによって駆動されるシステムで作業しました。

C#を使用している場合、Reportエンティティのデータ選択の側面は、EFにパススルーできるLINQ式ツリーとして実装できます。

3
Sentinel

必要なページネーションデータを定義するページネーションオブジェクトをいくつか追加するだけです。たとえば、次の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が示したように、ドメインモデルはクエリを制御するためにデータ層で使用されるため、ドメインモデルにはまったく影響しません。これは、クエリの一部としてページングを管理するためのほんの少しの追加情報です。

どのテクノロジースタックを使用しているかはわかりませんが、ここで示した概念は同様に適用できます。

0
Jon Raynor