2009-10-28 11 views
6

Ho alcuni problemi nella progettazione della radice aggregata. Ecco come lo vedo nella mia mente :)Design Aggregate Root Proper

Store (the aggregate root) 
-> Sales - A store create a sale every day 
-> Zones - A store is divided into zones 
    -> Styles - A zone has x number of styles 
     --> Colors - A style has x number of colors 
    etc.. 

Ora basato su questo la mia radice aggregata sarebbe il negozio. Tuttavia, se dovessi creare un repository, sarebbe simile a questo?

public class StoreRepository() 
{ 
    Store GetById() {...} 
    StoreZone GetZone() {...} 
    List<StoreZoneStyle> GetStylesByZone() {...} 
    List<Color> GetColorsByStyle() {...} 
} 

è che un buon modo per continuare? Inutile dire che sono nuovo del DDD.

risposta

6

Penso che avete bisogno di guardare ai confini aggregati e gli enti come qualcosa di più di una gerarchia. Le probabilità sono, avrai un modello più ricco di quello.

Il primo modo per sapere se il vostro aggregato è giusto, è che si può guardare in ciascuna delle entità all'interno di esso e chiedere: "Questo bisogno di accedere direttamente?" Se rispondi sì, allora quell'entità probabilmente non fa parte dell'aggregato.

Senza sapere di più sul tuo dominio, posso presumere che lo Store sia effettivamente un aggregato. Le vendite, d'altra parte, sono più complesse. Sì, le vendite si verificano in un negozio, ma hai bisogno di cercare di utilizzare una vendita in modo indipendente? Se ne hai bisogno al di fuori dello scopo di lavorare solo con un negozio, le vendite sono probabilmente al di fuori di tale aggregato.

sto immaginando che entrambi gli stili e colori sono immutabili e ripetibile, in modo che sarebbe probabilmente oggetti di valore in questo caso. Le Zone sono uniche per un negozio o variano?

Personalmente, trovo il valore per identificare tutti gli elementi nel dominio su carta (o lavagna). Passerò attraverso una fase di scoperta con gli stakeholder e li porteremo là fuori. Quindi, usa queste parole come leader nella conversazione, cercando di capire come si relazionano. Se intervisti lo stakeholder abbastanza bene, la descrizione che lui/lei dà in realtà definirà la maggior parte di ciò che stai cercando.

Non per battere un cavallo morto, ma il libro di Evans merita sicuramente di essere letto/letto. È un po 'secco, ma molto perspicace. Per un rapido avvio, puoi leggere lo free book su InfoQ che è fondamentalmente un riassunto del libro di Evans.

+0

Sì, vorrei accedere direttamente anche alle vendite, probabilmente semplicemente passando lo StoreId. Immagino che creerei un SaleRepository in quel caso? Le zone variano a seconda del negozio.Ogni negozio può avere una quantità x di zone separate. Creerei anche un ZoneRepository qui? Ho ordinato un libro di evans, tuttavia inizierei già a ricercare il mio dominio. Per favore fatemi sapere se avete bisogno di altre informazioni. Più conoscenza riuscirò a capire meglio capirò DDD. Grazie ancora. – vikasde

+0

I confini aggregati sono probabilmente la cosa più difficile nella DDD, secondo me. Se stai cercando di passare un identificatore di negozio in un deposito di vendite proposto, ci sono due possibilità che sono immediate. In primo luogo sarebbe che le vendite potrebbero essere parte dell'aggregazione del negozio che hai menzionato. L'altro potrebbe essere che uno Store potrebbe essere parte di un aggregato di vendite. L'unico modo in cui sarebbero in realtà entrambi gli aggregati sarebbe se fosse necessario accedere a entrambi in modo indipendente e senza che essi richiedano una conoscenza diretta l'uno dell'altro. Nota che non ti impedisce di ... –

+0

... con un riferimento a un'altra radice aggregata. Ad esempio, se si è determinato che sia Store sia Sales sono root aggregati, nulla impedisce a una Sale di avere un riferimento a un identificativo Store, che può quindi essere utilizzato per chiamare il repository Store per ottenere lo Store quando è necessario. Per quanto riguarda le Zone, esiste una relazione definita con lo Store. Ciò rafforza il fatto che Store * è * una radice aggregata e Zone è un'entità (dal momento che non sono necessariamente immutabili nel contesto che hai descritto). Quindi, al momento, siamo sicuri che Store sia un aggregato, contenente zone ... –

2

Sembra che "Store" non è radice di aggregazione, perché non si vuole nascondere tutte le funzionalità per "Zone", "vendite", ecc dietro oggetti "Store". In questo modo l'oggetto "Store" potrebbe essere molto gonfio.

"Store", "Zone" e "Vendita" potrebbe avere il proprio repository.

+0

Non sarebbe gonfio avere un repository per ogni oggetto? Dopotutto sono tutti legati allo Store, corretto? – vikasde

+0

Se c'è un repository per ogni oggetto non è gonfio. Sono oggetti più piccoli e più comprensibili (Principio unico responsabile). Se si dispone di una classe base per repository (Repository ), la sua scrittura di codice è ancora minore. In questo modo probabilmente dovrai scrivere solo domande speciali per quelle entità. –

5

I root aggregati sono limiti di coerenza per transazioni, distribuzioni e concorrenza (Eric Evans via Gojko Adzic).

Quando due persone modificano Zone diverse nello stesso Archivio, ciò dovrebbe causare un conflitto di concorrenza? In caso contrario, forse le Zone dovrebbero essere la loro radice di aggregazione separata dai negozi.