Patrones de diseño de la capa de acceso a los datos

Tengo que diseñar una capa de acceso a datos con .NET que probablemente utilizará más de un sistema de administración de bases de datos (Mysql y Sql Server) con el mismo diseño relacional.

Básicamente, tiene que ser simple cambiar de una base de datos a otra, por lo que me gustaría que me recomendara algunos sitios web o libros que le hayan sido útiles, con patrones de diseño comunes o información en general para implementar este tipo de acceso a los datos. capa.

Gracias.

Recomiendo Patterns of Enterprise Application Architecture de Martin Fowler.

Una lista de los patrones también está en su sitio web

El patrón DataMapper también es relevante.

Me gusta usar el acceso Db basado en interfaz. Todos los proveedores de db para Ado.net implementan interfaces básicas, y cuando los usa, su código puede verse así:

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; } 

Luego, cuando necesite comunicarse 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 esta técnica, puedes crear DAL independiente completamente de db. Por supuesto, para algunos escenarios complejos esto no es suficiente. Pero principalmente esto hará el trabajo, y usted no necesita varias libretas externas.

La solución más fácil sería usar un ORM. Echa un vistazo a LLBLGen. Al usar el Modelo de Adaptador puede cambiar entre proveedores de datos mientras usa los mismos objetos comerciales. Puede generar código para MySql y Sql Server.

En general, estoy de acuerdo con la recomendación de John Nolan de Patterns of Enterprise Application Architecture .

Más específicamente, siempre recomendaría que ocultes tu capa de acceso a datos detrás de una interfaz y que uses Inyección de dependencia para inyectar un componente de acceso a datos en particular en tu lógica de dominio en tiempo de ejecución.

Puede usar un Contenedor de Inyección de Dependencia o hacerlo manualmente .

En cuanto a la tecnología, recomendaría Entity Framework de Microsoft, ya que sus necesidades de acceso a los datos parecen estar limitadas a las bases de datos relacionales. Entity Framework es el OR / M oficial de Microsoft y tiene proveedores para muchos RDBMS diferentes, así como soporte LINQ.

Realmente depende del tamaño de tu capa y del tipo de producto que desarrolles. Si está bastante bien contenido, entonces ADO.NET probablemente sea ideal. Si se trata de una capa DAL más grande, y su desarrollo totalmente nuevo de dbms multidireccionales, es mejor utilizar una herramienta ORM. Son productos rápidos, eficientes y maduros, y pueden permitir rápidamente la reorientación a otro DB, simplemente cambiando un solo parámetro. Escribir ADO estático es algo que está pasando al legado.

Hay varias herramientas ORM que pueden hacer el trabajo, todas funcionan levemente de manera diferente y dependen de su presupuesto, tamaño de su equipo, etc. Pueden funcionar escribiendo una clase de mapeo como NHibernate, o trabajando a través de la reflexión, es decir, el marcado de atributos. .

De forma gratuita, es decir, fuente abierta, si su skint, NHibernate es ideal. Estoy usando esto en este momento, para construir la capa DAL, para un producto enteprise grande. Es excelente, pero tómate un tiempo para dominar. Con NHibernate usted define las clases de mapeo, que cuando se ejecutan generan el modelo db por usted. Es compatible con procedimientos almacenados. La desventaja es que lleva algo de tiempo aprender, especialmente cuando se mapean correctamente datos complejos. Es excelente. Tiene un gran paquete de muestras y otros proyectos flotando sobre eso lo usó. Echa un vistazo a Koders.com.

Si tiene un poco de presupuesto, entonces LLBLGen es ideal. Está fuertemente tipado y también admite procedimientos almacenados.

Si algunos de los modelos de datos ya están disponibles, entonces TierDeveloper es ideal. Es esencialmente gratuito y funciona desarrollando un conjunto de clases a partir de su modelo de base de datos. El único inconveniente es que el mapeador de MySQL es de terceros. Es un producto de clase enteprise que se ha hecho libre para admitir ncache, y es un posible enfoque.

Si está desesperado por quedarse con MS, se están moviendo hacia ORM, y tienen un producto llamado ADO.NET Entity Framework. Funcionalmente no es tan completo como las herramientas definidas anteriormente. Tiene cerca de 3 generaciones de retraso en la madurez. Está disponible en vs 2008 sp1. El conector para mysql sería un costo.

Además, podrías usar LINQ. También se dirigirá a mysql, si también necesita el conector.

Idealmente, tu mejor apuesta es con ORM. Si no puede admitir código abierto y tiene presupuesto, obtenga

Espero que ayude.

He descubierto que ADO.NET es muy útil para esto. Tiene todas las características que necesita para crear una capa de acceso a datos independiente de la base de datos que utiliza.

NHibernate está diseñado para manejar este tipo de escenario si está dispuesto a aprenderlo