Entity Framework ed evitando il modello di dominio anemico

11

Nella nostra logica di business occasionalmente abbiamo metodi definiti come:

User.ResetCourse(Course courseToReset)

Il problema è che sia Utente che Corso sono oggetti proxy Entity Framework. Ciò significa che quando colpiamo le proprietà di navigazione su Utente o Corso, può causare un enorme successo al database perché tali oggetti non sono IQueryable, quindi iterano normalmente attraverso di essi.

Per risolvere questo abbiamo cambiato la firma in:

User.ResetCourse(MyDBContext db, Course courseToReset)

Ciò significa che possiamo interrogare direttamente il database per apportare le modifiche di cui abbiamo bisogno in modo efficiente, ma passare il contesto del database a un oggetto business sembra così sbagliato.

Successivamente, abbiamo migrato all'utente un livello di servizio, il che significa che abbiamo qualcosa del tipo:

CourseService.ResetForUser(Course courseToReset, User forUser)

Questo servizio ha un riferimento a DBContext inserito nella creazione, ma ora i nostri oggetti business sono solo sacchetti di dati senza comportamento (cioè un modello di dominio anemico).

Come possiamo evitare questo?

    
posta Steve 30.09.2016 - 15:58
fonte

3 risposte

6

Il problema è che stai utilizzando oggetti EF come oggetti di dominio in primo luogo. Gli oggetti EF sono modelli di dati NON modelli di business.

Devi dichiarare oggetti di business che ti danno la libertà di fare ciò di cui hai bisogno, e poi recuperarli e memorizzarli con un repository. Il tuo repository mapperà le entità EF alle entità aziendali. Gli oggetti EF non dovrebbero mai essere usati al di fuori dei tuoi repository.

    
risposta data 17.04.2017 - 17:04
fonte
0

Probabilmente puoi evitarlo facendo qualcosa del tipo:

CourseService.prepareForUserCourseReset(DBContext db);
User.reset();
Course.reset();
CourseService.completeUserCourseReset(DBContext db);

O qualcosa del genere, comunque, se capisci la mia direzione. Sembra che l'approccio che hai con il modo iniziale che hai descritto sia performance correlato e non necessariamente correlato alla struttura del dominio. Quindi in realtà dovresti considerare di risolvere il problema di prestazioni nel livello di servizio, ma puoi mantenere il comportamento nel dominio. Sarebbe utile sapere cosa significa resettare l'utente / il corso in questo contesto, se si desidera una risposta migliore.

    
risposta data 19.04.2017 - 05:58
fonte
-1

Tradizionalmente, questo è risolto utilizzando una strategia di recupero per ogni caso d'uso che indica a Entity Framework di caricare con impazienza le associazioni necessarie sulla query iniziale usando IQueryable.Include ().

Udi Dahan ha scritto un post che descrive l'approccio generale, che può essere adattato a Entity Framework.

link

    
risposta data 16.11.2016 - 16:44
fonte

Leggi altre domande sui tag