2013-06-13 15 views
5

Utilizzo la struttura Prism con EF nell'applicazione WPF.MVVM + Confusione dell'architettura Entity Framework

ViewModel:

  • mantiene i riferimenti di servizio (passati dal contenitore unità).

Servizi:

  • stanno fornendo le operazioni di "alto livello" con i dati
  • mantiene riferimento del Repository, che fornisce operazioni CRUD di base con il database (tavolo singolo per ogni repository).

Repository:

  • ogni metodo nel repository utilizza il modello di "usare", dove lavoro con brevi contesto dell'oggetto durata.

Questo è il punto in cui mi sono bloccato: dopo che il contesto dell'oggetto è stato eliminato, non posso più lavorare con le proprietà mappate. Il mio modello di database è complesso (molte tabelle correlate) e molte chiamate .Include() quando si recuperano dati mantengono il codice sporco.

Dopo aver letto diversi thread, ho scoperto che il pattern "unità di lavoro" è probabilmente quello di cui ho bisogno.

Qui viene la mia domanda:

che mantiene di riferimento di unità di lavoro (e quindi contesto)? Se scelgo l'approccio context per view, viewModel dovrebbe avere un riferimento al contesto. Come posso iniettare unità di lavoro ai miei servizi allora? O dovrei creare una nuova istanza di servizio in ViewModel e passare il contesto nel parametro costruttore?

risposta

3

Stiamo usando un'architettura simile in un progetto:.

  • Ogni ViewModel ottiene proprio oggetto servizio che viene iniettato nel costruttore (almeno quelli di livello superiore che corrispondono direttamente ad un visualizzare alcuni i ViewModels gerarchici possono riutilizzare il servizio dei loro genitori, ma manteniamolo semplice qui).

  • Per impostazione predefinita, ogni operazione di servizio crea un contesto nuovo, ma ...

  • servizi hanno metodi BeginContext e EndContext che possono essere chiamati dalle ViewModels per mantenere il contesto aperto su più operazioni.

Questo ha funzionato abbastanza bene per noi. La maggior parte delle volte chiamiamo BeginContext quando una vista è aperta e EndContext quando viene chiusa.

+1

Infine, risolvo questo con il seguente approccio: quando View è aperto, ViewModel crea l'oggetto UnitOfWork, che consiste di contesto e numerosi servizi. I servizi nella stessa unità di lavoro hanno iniettato lo stesso contesto. L'unità di lavoro viene eliminata quando la vista è chiusa. Il progetto in questa discussione [collegamento] (http://teusje.wordpress.com/2011/10/16/unicornmanager-prism-4-mef-wpf-ef-4-1-code-first-nuget-datavalidation/) è anche stimolante. Grazie, Daniel. – yurislav