Domanda

Prendere il dominio proposto in Efficace Di Aggregazione Design di un Prodotto che ha più Versioni.In questo articolo, Vaughn arriva alla conclusione che sia il Prodotto che il Rilascio dovrebbe essere loro radici di aggregazione.

Supponiamo ora di aggiungere una funzionalità

  • Come responsabile del rilascio Vorrei essere in grado di ordinare versioni in modo che Posso creare linee temporali per un rotolamento più grandi poemi epici per i nostri utenti

Io non sono un PM con un bisogno specifico, ma sembra ragionevole che vorrebbero la possibilità di ordinare i rilasci nell'interfaccia utente.

Io non sono esattamente sicuro di come questo dovrebbe funzionare.La sua naturale per ogni Release per avere un ordine di proprietà, ma ri-ordinare comporterebbe la modifica di più aggregati nella stessa transazione.D'altra parte, se le informazioni vengono memorizzate nel Prodotto aggregato è necessario disporre di un metodo come product.setRelaseOrder(ReleaseId[]) che sembra un po ' strano di dati per memorizzare in un posto completamente diverso da quello Release.Peggio, l'aggiunta di una versione sarebbe coinvolgere ancora una volta la modifica su due diversi aggregati!Cos'altro possiamo fare?ProductReleaseSortOrder può essere propria di aggregazione, ma che suona addirittura assurdo!

Quindi cosa fare?Al momento sto ancora pendente verso il let-prodotto-gestire-si, ma cos'è corretto?

È stato utile?

Soluzione

Quindi, il prodotto e il rilascio sono entrambi ARS.La versione ha un'associazione al prodotto tramite aggregate.Vuoi ottenere elenco di tutte le uscite per un determinato prodotto ordinato da qualcosa?

Poiché l'ordine è un attributo di aggregato, quindi dovrebbe essere impostato sul prodotto, ma anche i rilasci sono ARS e non dovresti accedere al repository di rilascio nel prodotto AR (ogni AR dovrebbe avere il proprio repository).

Avrei semplicemente un rilascio di sleakervice che prende il parametro productid e ordina il parametro e il releaseserboitory.loadOrdedReleaseSforproduct (Productid, Order).

Penserei anche a separare i contesti, forse il modello per la presentazione del rilascio dovrebbe essere in un altro contesto?Nell'esempio ulteriori prodotti AR che verranno utilizzati solo per la query.

Altri suggerimenti

Ho scoperto che, in realtà, è meglio creare un nuovo aggregate root (ad esempio, ProductReleaseSorting come suggerito) per ogni singolo ordinamento e/o di ordinamento scopi.Questo è perché releaseOrder chiaramente non è in realtà una proprietà di Product, cioè, qualcosa che ha un significato su un prodotto proprio.Piuttosto, è in realtà una proprietà di "vista" su un collezione di prodotti, e questo punto di vista dovrebbero essere modellato sul suo.

Il motivo per cui tendo a introdurre un nuovo aggregato di root per ogni singola visualizzazione di un insieme di elementi diventa chiaro se si pensa a cosa succede se si dovesse introdurre altri ordinamenti, in futuro, diciamo un "marketing ordine", o più responsabili di prodotto desidera mantenere la loro ordinazione etc.Qui, si può facilmente vedere che "marketing ordine" e "ordine di rilascio" sono due concetti diversi che devono essere trattati in modo indipendente, e se più persone vogliono ordinare i prodotti con la stessa chiave, ma utilizzando diversi ordinamenti, avrai bisogno individuale "per persona vista".Inoltre, potrebbe essere che ci sono più di ordine di criteri che tengano conto quando ordinamento (un esempio per questi ultimi sarebbe (in un contesto diverso) il percorso più veloce vspercorso più breve), che dipende dalla vista che si ha sulla raccolta, e non sulle singole proprietà dei suoi elementi.

Se si gestisce il Product Manager di differenziazione in un ProductReleaseSorting di aggregazione, si

  1. hanno un'unica fonte di sostegno per l'ordinazione (AR),
  2. il ProductReleaseSorting AR può imporre vincoli come ad esempio che i due prodotti non hanno lo stesso numero d'ordine, e si
  3. non affrontare il problema di dover aggiornare più ARs in una singola transazione quando si cambia l'ordine.

Nota che il tuo ProductReleaseSorting di aggregazione ha probabilmente un'identità unica ("Singleton") nel dominio, cioè, tutti i product manager condividono lo stesso ordinamento.Se, tuttavia, tutti i membri del team vorrebbero avere loro ProductReleaseSorting, è banale per il supporto che dà il ProductReleaseSorting un ID corrispondente.Allo stesso modo, una più generica ProductSorting possono essere prese da un a-team (ID marketing vs.gestione del prodotto) dal repository.Tutto questo è facile con un nuovo e distinto di aggregazione principale per l'ordinazione di fini, ma è difficile se si aggiungono le proprietà sottostante oggetti/entità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top