Architettura aziendale: dove mettere la gestione della persistenza / dbContext? [chiuso]

3

Sto lavorando per progettare una soluzione a livello aziendale e una domanda su come gestire al meglio i dettagli di persistenza.

La mia configurazione generale è che esiste un set di base di business logic / oggetti, oltre a un numero di componenti isolati che si basano sulla logica di base, ma mai su altri componenti. Sedersi sopra questo componente / core business logic è una logica applicativa e roba di presentazione. Sotto questi due livelli c'è l'infrastruttura e la persistenza.

nota:attualmentestolavorandoalcoreinmodospecifico,nonhoancoraottenutocomponentiin

Implementazionepersistenzacorrente:

Attualmente(enoncorrettamente,sospetto),ilmioprogettoCorehaunriferimentoalprogettoPersistenzaeunmodelloCore(Ordini,diciamo)hauncampoIOrderRepository.Quandol'ordinevieneistanziato,possorecuperareleinformazioni,possosalvarle,ecc.

Lamiapreoccupazioneattuale:

1)ImieioggettideldominioprincipalenonstannoseguendoSRPperchéessenzialmentehannodeidettaglidipersistenzaadessicollegati(nonostantetalidettaglisianodettaglidell'interfacciainvecedeidettaglidiimplementazione,èancoralì).

2)LeggendounbuonarticolosullagestionediDbContextdiEF(chepuòessereconsideratoinuncontestodicontestopiùgenericodiEFinparticolare)(ref: link ) - Mi sono reso conto che ha poco senso caricare un contesto di persistenza quando viene caricato un oggetto dominio, perché non è affatto rappresentativo del contesto in cui vengono utilizzati gli oggetti (ad esempio, gli oggetti potrebbe essere caricato in un numero qualsiasi di contesti) (nota anche che non mi sono dimenticato di Aggregates, ma non incluso qui per semplicità perché il risultato finale è lo stesso, credo).

Cosa sembra meglio:

"Mi sembra" meglio che il contesto di persistenza (e quindi DbContext e quindi i repository) debba essere gestito nel contesto generale di qualsiasi attività aziendale specifica piuttosto che semplicemente su un oggetto business, che, di per sé, ha nessun contesto vero nonostante incapsulino vari comportamenti (questa affermazione è corretta ??).

Considerando che un contesto di persistenza / dbContext può essere essenzialmente considerato una transazione, sembra quindi più corretto, in senso lato, che tale contesto di persistenza debba essere incluso dove iniziano queste azioni di guida, poiché questo è il contesto in cui essenzialmente operare.

Quello che non riesco a capire:

Come faccio a impostarlo in modo che il contesto di persistenza sia più vicino al contesto in cui è usato (che sembra giusto, ma correggimi se ho torto), mentre allo stesso tempo lo separo completamente dagli oggetti del dominio questi ultimi mantengono il loro SRP richiesto (ad es., quindi non ho metodi Save () e Load () sugli oggetti del dominio, non importa quanto siano lontani da loro)?

Apprezzo qualsiasi suggerimento su come evitare che si trasformi in un caos confuso. Grazie

    
posta jleach 24.11.2015 - 12:34
fonte

1 risposta

1

Prendendo alcuni suggerimenti dai seguenti due post (apparentemente le capacità di ricerca di SE sono migliori delle mie ...), ho trovato qualcosa che sembra adattarsi bene.

Sono oggetti persistenza ignoranti in grado di implementare il caricamento lazy?

dove per convalidare le regole del modello di dominio che dipendono dal contenuto del database?

Sembra che io stia cercando ObjectProvider. Essenzialmente, questi vivono al di fuori dell'ambito degli oggetti del dominio stessi e sono legati a un particolare pezzo del livello dell'applicazione. Il loro ruolo è quello di istanziare gli oggetti del dominio come richiesto e gestirne la persistenza (sebbene l'implementazione della persistenza stessa risieda ancora nel livello di persistenza inferiore).

Quindi, i livelli dell'applicazione non interagiranno direttamente con gli oggetti POCO di dominio stessi, ma li genereranno invece attraverso questi provider.

Avere la sezione per-application dei provider mi consente di implementare i dettagli richiesti per contesto (ad esempio, l'applicazione A potrebbe solo caricare X parte del grafico dell'oggetto, dove l'applicazione B potrebbe richiedere X e Y, ecc.)

Lo schema seguente non è il più bello ma descrive abbastanza bene il layout:

Ora gli oggetti dominio stessi sono completamente liberati dal livello di persistenza e la gestione di persistenza stessa è più vicina al contesto in cui è usata (mentre la implementazione persistenza rimane isolata nel proprio livello).

Questo probabilmente non è perfetto al 100%: sono sicuro che ci saranno ulteriori dettagli che dovrò appianare, ma da una vista di 30kft, sembra molto meglio.

Detto ciò, sono ancora aperto all'esplorazione di altre idee, quindi se ne hai una puoi sentirla libera di sputarla. Grazie

    
risposta data 24.11.2015 - 14:05
fonte