Ricerca di un bambino attraverso le radici aggregate

Il modello di repository suggerisce che è ansible solo estrarre radici aggregate. Ma come faresti a recuperare un singolo figlio usando solo la sua id quadro uniqiue (Child.ID) se non sai che è genitore (root)?

class Parent { public int ID { get; set; } IEnumerable Children { get; private set; } } class Child { public int ID { get; private set; } public virtual Parent Parent { get; private set; } // Navigational model } 

La mia applicazione è stateless (web), per semplicità, la richiesta contiene solo l’ID del bambino.

Sto pensando a tre approcci:

  1. Chiama tutti i genitori poi chiedi educatamente a chi appartiene questo bambino.
  2. Avere una routine speciale nel ParentRepository chiamata get GetChildByID, che blocca in qualche modo l’astrazione del repository.
  3. Modifica la richiesta per includere il genitore, ma sembra inutile poiché hai già un’identity framework unica.

Sembra probabile che tu stia effettivamente guardando un diverso contesto limitato qui. Hai menzionato nella tua domanda che “repository … può solo estrarre radici aggregate”. ; questo è corretto. Un’altra risposta dice anche che se è necessario interrogare un object figlio, l’object figlio può anche essere una radice aggregata. Questo potrebbe anche essere corretto all’interno di un diverso contesto limitato . È ansible che un’ quadro sia una radice aggregata in un contesto e un’entity framework valore in un’altra.

Prendiamo ad esempio il dominio degli Users e le Apps dispositivi mobili / tablet che hanno installato sui loro dispositivi. Nel contesto dell’utente, potremmo desiderare le proprietà di base degli utenti come nome, età, ecc. E potremmo anche desiderare un elenco di app che l’utente ha installato sul proprio dispositivo. In questo contesto User è la radice aggregata e App è un object valore.

 bounded context UserApps { aggregate root User { Id : Guid Name : string Age : int InstalledApps : App list } value object App { Id : Guid Name : string Publisher : string Category : enum } } 

In un altro contesto potremmo prendere una visione centrata App del mondo e decidere che App sia la radice aggregata. Supponiamo ad esempio di voler segnalare quali utenti hanno installato una determinata app.

 bounded context AppUsers { aggregate root App { Id : Guid Name : string InstalledBy : User list } value object User { Id : Guid Name : string InstalledOn : Date } } 

Entrambi questi contesti limitati avranno il proprio repository che restituisce la rispettiva radice aggregata. C’è una differenza sottile ma cruciale nella tua prospettiva dei dati.

Penso che se fai un passo indietro e pensi al motivo per cui vuoi eseguire una query per un object figlio, potresti scoprire che ti trovi effettivamente in un contesto limitato completamente separato.

Se richiedi al bambino di mostrare / riferire / visualizzare / riportare, allora sarà sufficiente un semplice livello di query.

Se stai manipolando il bambino in qualche modo, allora ha un confine di consistenza e suona molto come un aggregato.

Cerca di non interrogare i tuoi oggetti di dominio. Un’altra semplice regola empirica non è includere un riferimento aggregato in un altro aggregato, ma piuttosto utilizzare solo l’ID dell’aggregato di riferimento o anche un object valore che rappresenta la relazione.

La navigazione delle quadro non è uno scopo di un modello di dominio.
Una radice aggregata è una composizione di entity framework e valori che espongono le operazioni aziendali.
Come effetto collaterale, puoi comunque eseguire una semplice query o navigare attraverso la tua AR, ma, per query complesse, creare e usare un modello di query è più efficiente.
Sto parlando di CQRS .

Spero che questo possa aiutarti.