Entity Framework e separazione dei livelli

12

Sto provando a lavorare un po 'con Entity Framework e ho una domanda riguardante la separazione dei livelli.

Di solito utilizzo l'interfaccia utente - > BLL - > Approccio DAL e mi chiedo come usare EF qui.

Il mio DAL di solito è qualcosa di simile a

GetPerson(id)
{
    // some sql
    return new Person(...)
}

BLL:

GetPerson(id)
{
    Return personDL.GetPerson(id)
}

UI:

Person p = personBL.GetPerson(id)

La mia domanda ora è: poiché EF crea il mio modello e il DAL, è una buona idea avvolgere EF all'interno del mio DAL o è solo una perdita di tempo?

Se non ho bisogno di riavvolgere EF, inserirò ancora il mio Model.esmx all'interno della sua libreria di classi o andrebbe bene inserirlo nella mia BLL e lavorarci?

Non riesco davvero a vedere il motivo per avvolgere EF all'interno del mio DAL, ma voglio sapere che cosa stanno facendo gli altri.

Quindi invece di avere quanto sopra, vorrei lasciare fuori il DAL e basta fare:

BLL:

GetPerson(id)
{
    using (TestEntities context = new TestEntities())
    {
            var result = from p in context.Persons.Where(p => p.Id = id)            
                    select p;
    }
}

Che cosa fare?

    
posta Thomas 21.12.2011 - 10:46
fonte

3 risposte

13

L'esempio che fornisci è un'architettura difficilmente stratificata. So che è intenzionalmente semplificato, ma:

Il tuo livello di presentazione è direttamente legato all'entità Person. Questo è OK solo nei casi più semplici, e sicuramente non quando cerchi di definire i tuoi livelli.

Il metodo GetPerson utilizza anche una pratica piuttosto negativa di creazione di un nuovo contesto per ogni chiamata. Dovresti ottenere il contesto nel costruttore e sarà fornito dal tuo contenitore IOC.

Una struttura semplice ma efficace che ho usato è:

  • Project.Core - contiene i modelli e le interfacce di visualizzazione.
  • Project.DAL - con il mio EDMX e il codice generato.
  • Project.BLL - business logic.
  • Project.Web - l'app Web stessa.

È importante notare che:

  • Il core non dipende da altre soluzioni.
  • DAL non dipende da altre soluzioni.
  • Project.Web dipende da Core, ma non da DAL né da BLL.
  • BLL dipende da Core e DAL.
risposta data 21.12.2011 - 11:29
fonte
2

Non è necessario avvolgere il tuo EDMX in nulla.

Se puoi prevedere la possibilità di dover passare da EF a un altro approccio, potresti voler estendere i tuoi oggetti di business (sfruttando le classi parziali) per implementare le interfacce definite in un livello Business Object separato.

Quindi dal tuo codice ti occuperai solo di quelle interfacce e non delle classi generate dal calcestruzzo. Potrebbe essere necessario un piccolo codice di colla per tenerlo insieme; quello con EDMX può essere il tuo DAL.

    
risposta data 21.12.2011 - 11:48
fonte
2

Esistono due approcci generali alla stratificazione: stratificazione rigorosa e stratificazione rilassata.

Un approccio a livelli rigorosi vincola i componenti di un livello all'interazione solo con i peer e con il livello direttamente sotto.

Un'applicazione a livelli rilassati scioglie i vincoli in modo che un componente possa interagire con i componenti di qualsiasi livello inferiore.

L'uso della stratificazione rilassata può migliorare l'efficienza perché il sistema non deve inoltrare semplici chiamate da un livello all'altro. D'altra parte, l'utilizzo di layering rilassato non fornisce lo stesso livello di isolamento tra gli strati e rende più difficile lo scambio di un livello inferiore senza influire sui livelli più alti.

Per soluzioni di grandi dimensioni che coinvolgono molti componenti software, è comune avere un gran numero di componenti allo stesso livello di astrazione che non sono coesi. In questo caso, ogni strato può essere ulteriormente decomposto in uno o più sottosistemi coesivi. La Figura 2 illustra una possibile notazione UML (Unified Modeling Language) per rappresentare i layer composti da più sottosistemi.

conclusione: se non hai bisogno che lo strato intermedio lo perda; non tutte le applicazioni richiedono lo stesso approccio e in qualche modo l'aggiunta di un layer solo per scopi di stratificazione comporta sanzioni in termini di costo e manutenzione della complessità.

    
risposta data 21.12.2011 - 15:23
fonte

Leggi altre domande sui tag