2015-10-05 14 views
5

A volte quando si lavora su applicazioni, specialmente quando si cerca di seguire i modelli OOD e DDD appropriati, si finisce con classi di dominio come Customer. Quindi abbiamo un repository che caricherà questo oggetto, e tutto è bello e pulito.Esiste un modello DDD comune per gestire il sotto carico di oggetti dominio?

Quindi l'applicazione diventa più complessa e iniziamo ad ottimizzare le prestazioni. Spesso ci troviamo in situazioni in cui non è necessario caricare, ad esempio, un elenco di oggetti interi Customer, ma forse solo ID e nomi o un piccolo sottoinsieme di proprietà (ad esempio per visualizzare in una griglia)

Soluzioni che ho visto spesso includono:

  1. Under carico oggetti di dominio, in modo sostanzialmente ci sarebbe ancora usare Customer classe, ma vorremmo utilizzare il metodo repository separato per caricare quelli, e che il metodo repository saremmo caricare dal database solo i campi obbligatori e popolare le proprietà corrispondenti negli oggetti. I restanti campi Customer rimarranno ai valori predefiniti. Questa è una soluzione semplice, ma può portare a molti errori se lo sviluppatore (o il codice esistente) si aspetta che alcune proprietà vengano caricate.

  2. Purpose-classing dove creiamo classi come CustomerIdName, CustomerInfo, CustomerHeader che contengono solo le proprietà di cui abbiamo bisogno. Questo approccio potrebbe creare un gran numero di classi, ma con un'attenta sottoclasse è praticabile. Sembra che tolga comunque il concetto di linguaggio di dominio ubiquitario.

Quindi c'è qualche convenzione generalmente concordata per gestire quelli nel mondo DDD? Ho provato a google questo, ma non sono riuscito a trovare nulla di autorevole.

O forse è solo una nota limitazione del classico approccio DDD e CQRS o altri approcci sarebbe meglio in quegli scenari?

risposta

5

Penso che il secondo approccio sia la strada da percorrere. Lo stiamo facendo in questo modo nei nostri progetti, ma solo per le classi DTO di sola lettura. Finché non li stai usando per l'inserimento/aggiornamento, va bene, immagino.

C'è anche che answer forse avete interessato in:

+0

Grazie, la risposta a cui ti sei collegato è esattamente lo stesso problema che sto affrontando. Dovrei pensarci un po 'di più, ma il concetto di aggirare il modello di dominio per determinate domande di applicazione è una soluzione molto interessante. –

+0

Vedi anche: [Lazy loading is design smell] (https://books.google.com/books?id=9ebGBwAAQBAJ&pg=PA507#v=onepage&q&f=false) – Ritesh

0

Hai esaminato Entity Framework? Hanno più livelli di caricamento pigro dell'entità: MSDN Post

+0

Sì, in realtà utilizziamo EF (tra le altre fonti, come i servizi Web esterni). In realtà ci stiamo lentamente spostando dal caricamento lento, in quanto poi devi ricordare se l'oggetto dominio con cui stai lavorando proviene effettivamente da Entity Framework e non puoi fare certe cose, come serializzarlo in sessione, senza interrompere la connessione EF. –

2

E 'una limitazione ben noto di DDD e CQRS è un ottimo approccio per risolverlo.

CQRS sul lato di lettura è fondamentalmente soluzione # 2 con tutte le precauzioni necessarie per evitare di confondere Leggi modelle con entità del dominio modificabili: nessun repository per loro, lezioni di sola lettura, ecc

+0

Grazie, per me ora ha più senso –

0

Io non capisco perché sotto carico può essere un problema Sapete quali campi non sono validi e quindi possono bloccarli/caricarli lentamente.

+0

Ok, qui è un esempio, diciamo che uno sviluppatore ha bisogno di cambiare il modo in cui i clienti sono caricati sulla pagina A - ora abbiamo bisogno di applicare un filtro specifico. Scopre che esiste già un metodo che carica il cliente con il filtro dato, quindi usa quel metodo. Ma poi durante i test risulta che ora vengono mostrati i clienti eliminati, anche se la pagina ignora specificamente i clienti cancellati? Perché? Bene 'deleted' era una proprietà booleana che non era stata caricata e per impostazione predefinita tutti i clienti appaiono come non cancellati. Questo può sembrare un esempio forzato, ma succedono situazioni del genere. –

+0

Il caricamento lento può essere anche problematico, i problemi di coppia a cui mi sono imbattuto sono: Contesto entità già disposto, quando si tenta di accedere alla proprietà lazy-loaded navigabile o si richiama una proprietà lazy-loaded uno-a-uno in una lista di grandi dimensioni, incorrendo in una considerevole penalizzazione delle prestazioni . –

+0

Tutto sembra non problematico, ovvero implementazioni non funzionanti. Una proprietà che non è caricata non può essere chiamata, il proxy dovrebbe solo restituire un errore –

Problemi correlati