Che cosa fare quando idratare l'intero modello di dominio non è necessario per le operazioni concrete?

1

Se un modello può esistere solo se viene passato un insieme di valori e su di essi viene eseguita la convalida, come caricare un tale modello se solo uno di questi valori è necessario per qualche azione?

Sembra un po 'sovraccarico fare di nuovo l'idratazione del modello se è necessario un solo valore per l'azione su quel modello. Può essere costoso.

Ho un modello d'asta. Ha titolo, descrizione, proprietario, valore corrente, date e offerte. Per operazioni particolari come offerta ho bisogno solo del valore corrente e delle offerte in questo modello per essere popolate. Tuttavia, il modello, teoricamente, non può esistere se altri valori non vengono ricevuti e convalidati (nel costruttore).

Cosa fare? Come fare la separazione? È normale / comune per DDD e ci sono solo alcuni compromessi che non puoi evitare?

    
posta chba 18.10.2015 - 10:35
fonte

2 risposte

2

Credo di capire il tuo dilemma.

Anche se può essere uno spreco reidratare l'intero aggregato per questo, l'aggregato serve allo scopo specifico di essere il confine di consistenza. Se avessi un sottoinsieme del dominio solo per gestire le offerte e l'aggregato completo per altre operazioni, come manterrai la coerenza quando hai potenzialmente due operazioni di manutenzione degli oggetti sullo stesso AR? Non hai più un singolo confine di consistenza. Sei sicuro che le prestazioni saranno un problema se reidratare l'intera cosa per questa operazione minore? L'hai misurato?

Se diventa un problema, una cosa che puoi fare è spostare i casi d'uso su un livello in modo che vengano intercettati prima che la radice aggregata sia caricata. Questo è comune nei sistemi basati su messaggistica in cui si impartiscono comandi al dominio (non si chiama un metodo direttamente su un aggregato caricato). I comandi vengono ricevuti dagli handler, che idratano l'aggregato come appropriato per il caso d'uso (ad esempio una versione cancellata dell'aggregato che si rifiuta di eseguire qualsiasi operazione dal momento in cui viene cancellata, o nel tuo caso una versione limitata che accetta solo le offerte). A volte i gestori caricano anche altri aggregati (solo per informazione, altrimenti il confine di consistenza viene violato di nuovo) o preparano i servizi da consegnare all'aggregato per eseguire il caso d'uso specificato.

In un sistema di messaggistica non in linea puoi ottenere lo stesso risultato con il Pattern di facciata . In sostanza, si crea un oggetto che è la tua interfaccia nel dominio. L'oggetto ha un metodo per caso d'uso. All'interno di quel metodo, si esegue il codice del gestore; idratare l'aggregato appropriato, scambiare le risorse / servizi necessari per il caso dell'utente e chiamare il metodo dell'aggregato. Forse salva anche le modifiche. Alla fine, è possibile ottenere troppi parametri sui metodi di facciata e sarà necessario rifattorizzarli su un oggetto. A quel punto, hai un messaggio di comando come parametro. :)

Tuttavia, se fai qualcosa di simile hai bisogno di alcune garanzie infrastrutturali. Ad esempio, un aggregato specifico può eseguire solo un caso di utilizzo alla volta. La mia prima infrastruttura come questa, ogni tipo di aggregato (non ogni istanza) poteva eseguire solo un caso d'uso alla volta - in altre parole se avessi inviato 100 operazioni, ciascuna a un'asta diversa, sarebbero comunque state eseguite una alla volta . In pratica, non si trattava di un problema di prestazioni, in quanto di solito si verificano più problemi di I / O rispetto alle operazioni di dominio.

    
risposta data 19.10.2015 - 17:12
fonte
0

Quando ti rendi conto che la maggior parte dei dati che un AR porta non è affatto necessaria per soddisfare alcuni dei suoi comandi, allora sei sull'impulso di scoprire un nuovo concetto di dominio. Un'altra analisi che può aiutare il processo di scoperta sta facendo un'analisi di conflitto di concorrenza per vedere se il tuo progetto introduce conflitti di concorrenza non necessari.

es. Dovresti cambiare il titolo dell'asta in conflitto con qualcuno che sta tentando di fare un'offerta?

Il fatto che tu stia facendo questa domanda è un strong indicatore del fatto che i tuoi confini aggregati sono errati e che il tuo concetto Auction non è attualmente molto coesa .

La maggior parte delle persone risolverà la parte di questo problema caricando i dati introducendo il caricamento lento, ma questo è un odore di codice e non affronta il cuore del problema.

Non riesco a capire se questo si adatta veramente al tuo dominio, ma per quanto riguarda l'avere un aggregato Listing e un aggregato Auction . Un Listing viene venduto attraverso un Auction .

Il Listing gestirà la parte descrittiva di ciò che viene venduto mentre Auction gestirà il processo di offerta.

Entrambi gli AR possono essere creati nella stessa transazione: la creazione di Auction è un effetto collaterale immediato della creazione di Listing .

"But there's a rule stating that one should not modify more than a single AR in a transaction".

Sì ed è molto importante rispettare questa regola, ma qui non stiamo modificando le AR che le stiamo creando e questo è molto diverso perché nessuna contesa può esistere durante il processo di creazione. Quelle AR non sono ancora risorse condivise.

    
risposta data 24.10.2015 - 15:59
fonte

Leggi altre domande sui tag