Is there any advice against having the fields (id, name, socialnumber, etc) of a relational database AND getters in a model then inherit them in WriteModel and ReadModel?
In realtà, c'è. Il modello di lettura e il modello di scrittura sono concettualmente diversi e, in particolare, si evolvono in modo ampiamente indipendente l'uno dall'altro.
Matthias Verraes ha scritto :
“Don’t Repeat Yourself” was never about code. It’s about knowledge. It’s about cohesion. If two pieces of code represent the exact same knowledge, they will always change together. Having to change them both is risky: you might forget one of them. On the other hand, if two identical pieces of code represent different knowledge, they will change independently. De-duplicating them introduces risk, because changing the knowledge for one object, might accidentally change it for the other object.
Mi aspetto che i modelli di lettura e scrittura contengano molti concetti comuni. I tipi di valore del modello di dominio, ad esempio: se si dispone di un tipo Money
, probabilmente avrà senso nel modello letto, proprio come nel modello di scrittura.
Tuttavia, come Constantin sottolinea , la motivazione per il modello CQRS è consentire alle scritture di utilizzare un sottostante struttura dati ottimizzata per le scritture (ad esempio: una cronologia) e legge una struttura dati sottostante ottimizzata per le letture. Quindi non avrei fretta di accoppiare il modello letto e scrivere il modello insieme.
I don't see how you're buying much from this except having immutable read objects. What purpose does that serve?
La chiarezza del codice è grande: mettere un riferimento a un'interfaccia immutabile nella firma del metodo indica chiaramente che non si sta tentando di modificare l'argomento in alcun modo. Pertanto, nei tuoi percorsi di codice di scrittura, non c'è confusione su quale oggetto verrà scritto: sarà sempre quello mutabile.