2009-02-15 5 views
5

Sono appena agli inizi con lo studio della progettazione basata sul dominio ed è del tutto possibile che la mia comprensione della divisione Entità/Valori sia errata, quindi se questo è così per favore fammi sapere.Come gestire un oggetto valore che deve cercare i dati nel database

Dalla mia comprensione, poiché la sua identità è completamente definita dalle sue proprietà, un indirizzo è l'oggetto valore quintessenziale. Dalla mia comprensione, ciò significa tra l'altro che non ci dovrebbe essere un repository separato o un oggetto di accesso ai dati per gli indirizzi.

Questo crea un problema per me dal momento che nel mio caso un indirizzo contiene un Paese in cui un Paese ha un nome e un codice paese e l'elenco dei codici paese deve essere caricato dal database.

La mia domanda è, come si progetta questo? Voglio che le persone siano in grado di creare un indirizzo usando il nuovo operatore, ma non voglio creare un oggetto di accesso ai dati per il Paese e, se lo faccio, non voglio certamente fare riferimento ad esso nell'oggetto dell'indirizzo.

Ho alcune idee, ma mi piacerebbe sentire qualche suggerimento che qualcuno potrebbe avere.

risposta

0

Questo crea un dilemma per me dal momento che in mio caso di un indirizzo contiene un Paese in cui un paese ha un nome e un country-code e l'elenco delle paese codici si suppone di essere caricato in dal database.

L'oggetto Address non avrebbe un elenco di paesi come proprietà. Piuttosto, avrebbe una singola istanza dell'oggetto Paese. Il Presentation Layer fornirebbe un elenco di oggetti Country, probabilmente residenti in un elenco a discesa. Dopo aver caricato un indirizzo specifico, si imposta il valore dell'elenco a discesa uguale all'ID paese dell'oggetto Paese che è una proprietà dell'oggetto Address. In altre parole:

(contenente un elenco di oggetti Nazione) valore dell'oggetto selezionato = address.Country o myDropDown del valore della chiave di myDropDown = address.Country.ID

Ora, per popolare il livello di presentazione, il tuo accesso ai dati Il livello dovrebbe fornire una funzione che restituisce un elenco non elaborato di oggetti Paese. In un certo senso .NET, sarebbe qualcosa di simile:

Namespace Dal 

    Public NotInheritable Class Countries 
    ... 
    Public Shared Function Read(ByVal countryId as Integer) As BusinessObjects.Country 
    ... 
    Public Shared Function ReadList() As List(Of BusinessObjects.Country) 
    ... 
+0

Sto progettando solo il modello di dominio, non imposto come verrà utilizzato. Il problema è che quindi gli utenti possono creare nuovi oggetti Paese, ma se lo fanno allora come faccio a garantirne uno stato valido? –

+0

Questo approccio sta facendo troppe ipotesi. Non posso presumere che ci sarà un livello di presentazione che ha accesso alla tua lista di paesi. Anche come ho detto che un oggetto di accesso ai dati per un oggetto di valore sembra solo sbagliato ... –

1

Vorrei iniziare dicendo che la mia unica esperienza con il dominio Driven Design stava leggendo l'articolo di Wikipedia pochi minuti fa. Detto questo, ecco i miei pensieri sulla tua domanda:

Sono d'accordo che l'oggetto indirizzo non dovrebbe richiedere alcun oggetto di accesso ai dati, quindi come su un factory indirizzo che gestisce i codici paese e costruisce gli oggetti indirizzo in base agli input da l'utente? In questo modo, la fabbrica manterrebbe gli oggetti di accesso ai dati e il tuo oggetto indirizzo potrebbe rimanere di valore.

Se questo non è kosher secondo DDD, quindi fatemelo sapere. Sono curioso di vedere cosa viene fuori dal resto della community.

+0

Non sono sicuro di come maglie questo per DDD, penso che sia corretto. Questo è simile a quello che sto pensando, anche se ho appena avuto la classe Address che gestisce questo da un elenco Paese statico che viene impostato all'avvio dell'applicazione. Penso che mi piaccia il tuo meglio. –

3

non c'è nulla nella DDD che preclude agli oggetti valore di contenere riferimenti a entità. Pertanto il tuo indirizzo avrebbe un riferimento a un'entità di un paese.

+0

Forse, ma dato che all'interno del mio dominio è usato solo negli indirizzi, sembra sbagliato rendere Country un'entità –

+0

Plus non so come implementarlo. Se permetto alle persone di inserire nuovi oggetti Address, l'oggetto indirizzo dovrebbe avere un riferimento a un'implementazione del DAO nazionale che rompa alcuni seri principi DI –

+0

Perché l'indirizzo deve conoscere un oggetto DAO. Basta avere una proprietà di campagna e lasciare che i clienti si occupino di dover trovare un paese. Quando si usa Hibernate come repository/DAO questo tipo di cose è banale dato che assicurerà di ottenere un paese quando l'indirizzo viene caricato dal database. –

1

Passando al modo DDD, prima penserai alle esigenze della tua applicazione e costruirai il modello da lì.

Non dovresti preoccuparti del Paese utilizzato solo in Indirizzo. Non è sbagliato renderlo un'entità di per sé. La domanda principale è: pensi a un Paese come a qualcosa che ha un'identità o è definito solo dagli attributi? Se hai due paesi con lo stesso nome (e lo stesso prefisso internazionale), puoi vedere qualche differenza?

Forse dovresti considerare di rendere Country un oggetto di valore. Non ti impedisce di avere un repository che carica l'elenco dei Paesi dal DB o che carica il Paese in base al suo codice. Sul lato dell'implementazione, il repository può ancora caricare l'elenco dei paesi dal database una volta e archiviarlo nella memoria. O potrebbe avere hardcoded, o leggere da XML. Il tuo modello di dominio non interesserebbe.

Probabilmente creerai un metodo di fabbrica su Indirizzo che accetta il codice paese tra gli altri parametri. Quindi utilizzerà il repository per creare un'istanza Country e restituire un oggetto Address corretto.

Pensare agli aggregati può anche fornire alcune idee sul layout del repository.

Spero che questo aiuti

+0

Questo sì, molte grazie. È sulla falsariga di quello che stavo pensando. Pensi che gli indirizzi siano nuovi o creati solo tramite AddressFactory che contiene un elenco di paesi? –

+0

Bene, Eric Evans ama vedere i suoi costruttori molto semplici. In questo caso, la ricerca del paese è probabilmente un lavoro per il metodo factory, non per il costruttore. Non ho ancora un'opinione forte su questo. –

Problemi correlati