Dal punto di vista architettonico, un livello di astrazione del database, come Microsoft Entity Framework, annulla la necessità di un livello di accesso ai dati separato?


11

Il modo in cui era

Per anni ho organizzato le mie soluzioni software come tali:

  • Data Access Layer (DAL) per astrarre l'attività di accesso ai dati
  • Business Logic Layer (BLL) per applicare le regole di business ai set di dati, gestire l'autenticazione, ecc.
  • Utilità (Util) che è solo una libreria di metodi di utilità comuni che ho costruito nel tempo.
  • Layer di presentazione che potrebbe ovviamente essere web, desktop, mobile, qualunque cosa.

Così com'è adesso

Negli ultimi quattro anni ho usato Microsoft Entity Framework (sono principalmente un sviluppatore .NET) e sto scoprendo che avere il DAL sta diventando più ingombrante che pulito a causa del fatto che Entity Framework ha già fatto il lavoro che faceva il mio DAL: riassume il business di eseguire CRUD su un database.

Quindi, di solito finisco con un DAL che ha una raccolta di metodi come questo:

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

Quindi, nel BLL, questo metodo viene utilizzato come tale:

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

Questo è un semplice esempio, naturalmente, poiché in BLL verrebbero applicate molte più linee di logica, ma sembra un po 'eccessivo mantenere un DAL per un ambito così limitato.

Non sarebbe meglio abbandonare il DAL e semplicemente scrivere i miei metodi BLL come tali:

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

Sto pensando di abbandonare il DAL da progetti futuri per i motivi sopra indicati ma, prima di farlo, volevo sondare la community qui per il tuo senno di poi / lungimiranza / opinioni prima di iniziare un progetto e scoprire un problema che non ho riscontrato t anticipare.

Ogni pensiero è apprezzato.

Aggiornare

Il consenso sembra essere che un DAL separato non sia necessario ma (facendo la mia deduzione qui) è una buona idea per evitare il blocco del fornitore. Ad esempio, se ho un DAL che sta astrattando le chiamate EF come illustrato sopra, se io mai passare a qualche altro fornitore non ho bisogno di riscrivere il mio BLL. Solo quelle query di base nel DAL dovrebbero essere riscritte. Detto questo, trovo difficile immaginare uno scenario in cui ciò accada. Posso già creare un modello EF di un db Oracle, MSSQL è un dato di fatto, sono abbastanza sicuro che anche MySql sia possibile (??), quindi non sono sicuro che il codice aggiuntivo possa mai garantire un ROI utile.


3
In che modo un / il tuo livello di accesso ai dati è diverso da EF? EF non è un livello di accesso ai dati? L'unica ragione per cui riesco a mantenere la tua astrazione tra la tua logica di business e EF è quella di rendere più facile il mobbing per i test ed evitare il blocco del fornitore.
Marjan Venema

2
Questo è il mio punto: non c'è alcuna differenza nella mia visione, ma sto cercando punti di contrapposizione. Grazie.
Matt Cashatt,

3
Personalmente non vedo alcun motivo per creare un DAL separato, perché EF / NHibernate sono livelli di accesso ai dati in sé. Come accennato da Marjan, con EF lo puoi considerare se riesci a vedere il fornitore di database cambiare, in NHibernate puoi scambiare i driver in una riga di codice (anche il driver SQLite per i test in memoria), quindi sarebbe (IMO) codice non necessario.
Patryk Ćwiek,

3
Non è necessario disporre di due DAL. Come altri hanno già detto, mantieni il tuo BLL, ma fai attenzione a evitare di bloccare il tuo BLL in costrutti specifici del fornitore. Mi piace sempre vedere le cose scendere al livello di stringa o intero. Quindi so che potrei facilmente esporre l'intera giunzione BLL / DAL attraverso un canale molto primitivo come servizi web, porta seriale, collegamento telegrafico, scherzando.
Andyz Smith,

1
re Aggiornamento: questo livello aggiuntivo può rendere Unittests del busineslayer molto più facile perché deridere / stub / fingere di GetMyObjects(int myId)è più facile che deridere / stub / fingere di GetObjects.Where(ob => op.accountId == myId).ToList().
k3b,

Risposte:


6

Non sono sicuro se questa è la risposta che stai cercando .. ma qui va.

Lo facciamo per mantenere le cose separate / organizzate. Sì, EF / NHibernate sono l'accesso ai dati .. ma ne limitiamo l'uso al proprio assembly con una configurazione di repository generica. Questo assieme contiene anche tutte le nostre mappature NHibernate, la fabbrica di sessioni, il codice per la gestione di più database, ecc.

Lo chiamiamo ancora "Livello di accesso ai dati", poiché l'intero assembly esiste per supportare il nostro ORM.

Dovrei probabilmente notare che la nostra app principale fa riferimento a 5 database, ha circa 4-500 oggetti / mappature di dominio e vari schemi. Quindi, questa configurazione ha senso per noi. Forse per un'app più piccola salteresti questo assembly ma .. Sono un fanatico del codice organizzato e probabilmente lo farei comunque :)


2

Vedo EF e DAL come componenti separati in un sistema Enterprise. Il livello di accesso ai dati è un'astrazione che altri servizi utilizzano per eseguire la persistenza e la gestione dei dati. In genere Entity Frameworks crea una bella API per interrogare, aggiornare, eliminare e inserire, ma al centro richiede comunque una connessione diretta all'origine dati back-end. Pertanto, qualsiasi tipo di instradamento o firewall impedirà il funzionamento dell'EF, richiedendo quindi la creazione di un componente di mediazione EF.

Ecco un esempio di alto livello che mostra dove si inseriscono DAL ed EF:

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

È stata la mia esperienza che una progettazione migliore non dovrebbe mai consentire alla logica di business o alle implementazioni di servizi l'accesso diretto al livello EF. Invece, per fornire un'astrazione per lavorare con tutti i dati persistenti che consente di inviare richieste via cavo o eseguirle localmente.

Questo design introduce però alcune astrazioni che perdono. Quindi dovrebbe essere considerato caso per caso.

Alcune domande da porre:

  • Tutti i componenti che accedono ai tuoi dati saranno in grado di ottenere una connessione all'archivio dati di back-end?
  • Il tuo EF ti consente di aggregare set di dati tra diversi tipi di archivi dati? Ad esempio utilizzando un database SQL con MongoDB per i documenti.

1

Al giorno d'oggi la domanda se cambi o meno l'archiviazione dei dati è più interessante di prima, dal momento che la domanda potrebbe non essere solo se si cambi o meno tra MS SQL o Oracle SQL, ma la domanda più grande se si potrebbe utilizzare una delle varie offerte di archiviazione dati NoSQL come repository di dati.

Se esistesse una seria possibilità di quel tipo di modifica, potrebbe essere utile mantenere isolato il codice EF all'interno del DAL in modo da poter introdurre in futuro un nuovo DAL che associ le richieste del repository a un database NoSQL. È possibile che un tale cambiamento finisca comunque con una riscrittura all'ingrosso del BLL a causa di ipotesi relative al db che si insinuano ovviamente.

Allo stesso modo, EF all'interno di un DAL probabilmente renderebbe più semplice la derisione dell'accesso ai dati per i test delle unità di codice BLL.

Quindi la mia opinione è che EF (o altri ORMS) non annulli necessariamente la necessità di un livello di accesso ai dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.