Dove si inserisce la logica aziendale nel modello di segregazione della responsabilità della query di comando?

2

Supponiamo che abbia un metodo come questo:

public int CalculateAge(DateTime birthDate)

Questo è un comando? Query? O dovrebbe essere separato e non incluso come comando o query?

Si adatta all'interfaccia di query ( TOut Execute(TIn input ), ma concettualmente non è una query, più di un mutatore.

Per un comando dovremmo impostare una variabile nel comando ed esporla poiché in genere i comandi non restituiscono nulla in modo che il chiamante possa accedere al risultato. Quindi, non vedo un buon adattamento lì.

    
posta Jon Raynor 02.11.2016 - 15:43
fonte

2 risposte

8

Il tuo esempio non è un mutatore, un comando o una query; è semplicemente una funzione . Dovresti conoscere la data odierna per effettuare il calcolo, ma chiamare una query allunga un po 'le cose.

CQRS è un modello architettonico . Affinché CQRS sia pertinente, è necessario che ci sia qualcosa da interrogare e comandare. In genere, sarebbe un database, ma potrebbe essere un dispositivo incorporato come un Arduino o qualsiasi altra cosa. CQRS separa semplicemente la funzionalità di query dalla funzionalità di comando, utilizzando due API separate.

In un'architettura software multilivello, CQRS risiede nel livello di servizio:

Database <--SQL--> DAL <--CRUD--> Service Layer <--Command-->  Client
                                              ^-----Query------^

Invece dei metodi Crea, Leggi, Aggiorna ed Elimina che operano su singole entità, il Service Layer esporrà metodi come TransferMoney e GetInvoice (come esempi di Command e Query, rispettivamente).

Ulteriori letture
Segregazione della responsabilità delle query dei comandi di Martin Fowler
< a href="https://msdn.microsoft.com/en-us/library/dn568103.aspx"> Esempio CQRS in C # su MSDN

    
risposta data 02.11.2016 - 16:02
fonte
5
public int CalculateAge(DateTime birthDate)

Is this a Command? Query?

Mi aspetterei che sia una query - sarebbe molto sorprendente scoprire che un metodo con quell'identificatore su di esso ha effetti collaterali. Il suggerimento è che non hai bisogno di modificare alcun dato per calcolare una risposta qui, hai solo bisogno di leggere .

Probabilmente non dovresti pensarlo come una pura funzione; "calcolare l'età" implica che stiamo effettuando un calcolo di data di nascita rispetto ad un altro punto di riferimento: lo stato dell'oggetto che serve la query o lo stato dell'orologio di sistema o .... Le funzioni Pure non includono lo stato nascosto.

The function result value cannot depend on any hidden information or state that may change while program execution proceeds or between different executions of the program

La terminologia "Query" di CQRS deriva da Separazione delle query di comando , un modello di interfaccia introdotto da Bertrand Meyer. Martin Fowler offre questo sommario

Queries: Return a result and do not change the observable state of the system (are free of side effects).

Greg Young, nell'introdurre CQRS, ha appena fatto evolvere il modello CQS: introducendo l'idea che i comandi e le query potevano essere separati in interfacce separate e potevano quindi essere implementati da oggetti distinti che condividono lo stesso stato logico (ma non necessariamente lo stesso stato fisico).

    
risposta data 02.11.2016 - 16:22
fonte

Leggi altre domande sui tag