Implementazione dell'impaginazione in DDD utilizzando i mapper dei dati

3

Come si dovrebbe implementare la paginazione in DDD con DataMappers? Ho pensato di creare oggetti Range e Order e di passarli ai metodi find, ma non so se questa è una buona soluzione dato che l'impaginazione in questo caso è una questione di interfaccia utente e prestazioni e non una questione che rappresenta il modello. Ho letto anche su CQRS ( link ), ma il modello su cui sto lavorando non sembra aver bisogno di modelli per rappresentare Query e Command.

Cosa ne pensate?

    
posta Lucas Piske 09.08.2016 - 04:36
fonte

2 risposte

1

In generale sono d'accordo con @RobertHarvey e la risposta sopra: se hai entità simili a repository, estendi semplicemente quelle per offrire il supporto di cui ha bisogno l'interfaccia utente.

Tuttavia, la tua domanda è specifica:

How should pagination be implemented in DDD with DataMappers?

Se vuoi davvero modellare il tuo problema nel dominio aziendale, potresti considerare un'entità Report che offre alcuni filtri di base, ordinamento, ecc. Un rapporto è un'entità aziendale comune. La maggior parte delle visualizzazioni dell'interfaccia utente di base nei sistemi line-of-business possono essere considerate semplici report, a volte interattivi.

Il modo in cui il report viene formattato può quindi essere considerato come un problema di interfaccia utente o un'entità di dominio ReportFormat gestita automaticamente da un'interfaccia utente intelligente. A seconda della situazione, potrebbe essere una grossolana sovraingegneria o piuttosto pragmatica. Ho lavorato su sistemi, ad esempio, in cui l'intera UI era guidata da SSRS.

Se stai usando C #, l'aspetto di selezione dei dati di un'entità Report potrebbe essere implementato come un albero di espressioni LINQ che potrebbe essere passato a EF.

    
risposta data 02.05.2018 - 12:11
fonte
0

Vorrei semplicemente aggiungere degli oggetti di impaginazione che definiscono i dati di impaginazione richiesti. Ad esempio, considera questo codice 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;
    }

Quindi passa semplicemente quelli come parte dell'oggetto query. Da lì è solo questione di scrivere query per supportare l'impaginazione. Ad esempio, considerare questa stored procedure di 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

Il tuo cliente dovrebbe tenere traccia di quale pagina era e passarla quando necessario. Come ha indicato @Robert, non ha alcun effetto sul tuo modello di dominio in quanto verrebbero utilizzati nel livello dati per controllare le query. È solo una piccola quantità di informazioni aggiuntive per gestire il paging come parte della query.

Non sono sicuro di quale stack di tecnologia stai utilizzando, ma i concetti qui illustrati possono essere applicati in modo simile.

    
risposta data 09.08.2016 - 17:19
fonte