Modelli di progettazione del livello di accesso ai dati

Devo progettare un Data Access Layer con .NET che probabilmente utilizzerà più di un sistema di gestione di database (Mysql e Sql Server) con lo stesso design relazionale.

Fondamentalmente, deve essere semplice passare da un database a un altro, quindi mi piacerebbe che tu mi consigli alcuni siti web o libri che ti sono stati utili, con schemi di progettazione comuni o informazioni in generale per implementare questo tipo di accesso ai dati strato.

Grazie.

Raccomando Patterns of Enterprise Application Architecture di Martin Fowler.

Un elenco dei modelli è anche sul suo sito web

Anche il pattern DataMapper è rilevante.

Mi piace usare l’accesso Db basato su interfaccia. Ogni provider di db per Ado.net implementa le interfacce di base e, quando le usi, il tuo codice potrebbe apparire come questo:

public static IDbConnection GetConnection(string connectionName) { ConnectionStringSettings ConnectString = ConfigurationManager.ConnectionStrings[connectionName]; DbProviderFactory Factory = DbProviderFactories.GetFactory(ConnectString.ProviderName); IDbConnection Connection = Factory.CreateConnection(); Connection.ConnectionString = ConnectString.ConnectionString; return Connection; } 

Quindi, quando è necessario comunicare con db:

 public static DataTable Dummy() { using (IDbConnection Connection = GetConnection("SiteSqlServer")) { IDbCommand Command = Connection.CreateCommand(); Command.CommandText = "DummyCommand"; Command.CommandType = CommandType.StoredProcedure; Connection.Open(); using (IDataReader reader = Command.ExecuteReader()) { DataTable Result = new DataTable(); Result.Load(reader); return Result; } } } 

Con questa tecnica puoi creare completamente DAL indipendente da db. Ovviamente per alcuni scenari complessi questo non è abbastanza. Ma principalmente questo farà il lavoro, e non hai bisogno di varie librerie esterne.

La soluzione più semplice sarebbe utilizzare un ORM. Scopri LLBLGen. Utilizzando il modello di adattatore è ansible passare da un fornitore di dati all’altro mentre si utilizzano gli stessi oggetti di business. Può generare codice sia per MySql che per Sql Server.

In generale, faccio la raccomandazione di John Nolan su Patterns of Enterprise Application Architecture .

In particolare, consiglierei sempre di hide il livello di accesso ai dati dietro un’interfaccia e di utilizzare Dependency Injection per iniettare un particolare componente di accesso ai dati nella logica di dominio in fase di esecuzione.

È ansible utilizzare un contenitore di iniezione delle dipendenze o farlo manualmente .

Per quanto riguarda la tecnologia, raccomanderei l’ Entity Framework di Microsoft, dal momento che le esigenze di accesso ai dati sembrano essere limitate ai database relazionali. Entity Framework è l’OR / M ufficiale di Microsoft e ha provider per molti RDBMS diversi, oltre al supporto LINQ.

Dipende molto dalle dimensioni del tuo strato e dal tipo di prodotto che stai sviluppando. Se è abbastanza ben contenuto allora ADO.NET sarà probabilmente l’ideale. Se si tratta di uno strato DAL più grande e del suo sviluppo greenfield di dbms multitargeting, è preferibile utilizzare uno strumento ORM. Sono prodotti veloci, efficienti e maturi e possono rapidamente abilitare il retargetting su un altro db, semplicemente cambiando un singolo parametro. Scrivere ADO statico, è qualcosa che sta passando in eredità.

Esistono diversi strumenti ORM che possono svolgere il lavoro, tutti funzionano in modo leggermente diverso e dipendono dal budget, dalla dimensione del tuo team, ecc. Possono funzionare scrivendo una class di mapping come NHibernate o lavorando tramite reflection, cioè markup degli attributi .

Gratuitamente, ad esempio open source, se sei skint, NHibernate è l’ideale. Sto usando questo al momento, per build il livello DAL, per un grande prodotto di impresa. È eccellente, ma prenditi un po ‘di tempo per padroneggiare. Con NHibernate si definiscono le classi di mapping, che quando vengono eseguite generano il modello db per te. Supporta le stored procedure. Il rovescio della medaglia è che ci vuole un po ‘di tempo per imparare, specialmente per mappare correttamente i dati complessi. È eccellente. Ha un enorme fascio di campioni e altri progetti che galleggiano su quello che ha usato. Dai un’occhiata a Koders.com.

Se hai un budget, allora LLBLGen è l’ideale. È fortemente digitato e supporta anche stored procedure.

Se alcuni modelli di dati sono già disponibili, TierDeveloper è l’ideale. È essenzialmente gratuito e funziona sviluppando una serie di classi dal modello di database. L’unico lato negativo è il mapper per mysql è di terze parti. È un prodotto di class enterprise che è stato reso gratuito per supportare ncache, ed è un ansible approccio.

Se si desidera disperatamente stare con MS, si stanno spostando verso ORM e hanno un prodotto chiamato ADO.NET Entity Framework. Funzionalmente non è completo come gli strumenti sopra definiti. È circa 3 generazioni indietro nella maturità. È disponibile in vs 2008 sp1. Il connettore per mysql sarebbe un costo.

Inoltre, è ansible utilizzare LINQ. Mirerà anche a mysql, se anche avessi bisogno del connettore.

Idealmente, la tua migliore scommessa è con ORM. Se non puoi supportare l’open source, e avere un budget, allora ottieni

Spero possa aiutare.

Ho trovato ADO.NET molto utile per questo. Ha tutte le funzionalità necessarie per creare un livello di accesso ai dati indipendente dal database che si utilizza.

NHibernate è progettato per gestire questo tipo di scenario se sei disposto ad apprenderlo