¿Es este un mal diseño? ¿Cómo puede ser mejorado?

9

Escribí lo siguiente hace un tiempo, pero he venido a revisarlo recientemente, y ahora no creo que sea un buen diseño.

El diseño es para un tipo de capa de base de datos modular que usa Entity Framework 4. Hay un único objeto de base de datos que carga (perezosamente) contextos de marco de entidad de bibliotecas externas en una ubicación específica, y las instancias de los contextos cargados se almacenan en una tabla hash contra su nombre (por ejemplo, "ContentMgmtContext").

Todo contacto con la base de datos en este sistema es a través de procedimientos almacenados. Para realizar una llamada a la base de datos, la firma del método de consulta se ve así:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

Esta modularidad es algo que me gusta. Sin embargo, hay un inconveniente importante en este enfoque: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.en el modelo, los objetos de la capa de la base de datos se traducen en nuevos objetos que utilizan la vista y el controlador.

Creo que este es un mal diseño, pero ¿cómo puedo mejorarlo? He considerado agregar una interfaz vacía IStoredProecedureObjectpara dar a cada tipo de datos devuelto por un procedimiento almacenado un tipo base común, sin embargo, esto parece ser frustrado por Entity Framework. Cada vez .edmxque se vuelve a compilar el archivo, el código se genera nuevamente y se eliminan las adiciones. ¿Hay alguna forma de evitar que esto suceda?

¿Cómo puedo mejorar este diseño? ¿Qué (más) está mal con eso? ¿O estoy en el camino correcto?

Andy Hunt
fuente

Respuestas:

6

Descargo de responsabilidad: no uso el marco de la entidad y estoy muy sesgado en contra de cualquier marco auxiliar de base de datos.

Parece que has hecho una envoltura.

Hago una distinción entre "envoltorio" y "capa". La capa es algo que podría compilar en su propia DLL / proyecto / Jar / lo que sea. La capa de acceso a datos. Wrapper es una clase "auxiliar" que usa dentro de esa DLL. Con el fin de simplificar la interfaz, o tal vez eliminar la duplicación.

El problema con la simplificación de la interfaz de acceso a la base de datos es que generalmente no es simple. O terminas duplicando la interfaz de ADO / JDBC / etc. O obligas a la gente a evitarlo. Los envoltorios tienden a hacer todo tipo de cosas no deseadas. Pueden cerrar automáticamente una conexión cuando la necesite para admitir una transacción. A menudo, por error, dejan las conexiones abiertas si tenía que transmitir datos y están utilizando uno de esos idiomas recolectados de basura. Para dar todo el poder de la biblioteca detrás de su contenedor, se ve obligado a duplicarlo.

Las bibliotecas como ADO / JDBC ya son una GRAN interfaz. Son algunos de los mejores ejemplos de POO bien hechos. Preferiría usarlos sobre una envoltura que algún wizbang sacó de su sombrero.

La clásica interfaz de estilo JDBC / ADO es bien conocida y entendida. El envoltorio que sacaste de tu sombrero no lo es.

¿Desea reducir los "parámetros" redundantes. Añadir "? Mira los genéricos. O simplemente acepte eso tratando de reducir "paramter.Add", en realidad solo empuja el ".add" a otra capa de código.

Por cierto, esta es una gran pregunta. Lo votaría 10 veces si pudiera.

Editar: por supuesto, el código JDBC estaría oculto en la capa de acceso a datos.

Lord Tydus
fuente
Estoy de acuerdo, en retrospectiva, que esto es más una envoltura de EF 4 que sí mismo. La idea detrás de esto era permitir que se reutilizaran diferentes piezas de conectividad de base de datos (como un modelo de datos estándar) y al mismo tiempo tener un único punto de entrada para múltiples bases de datos, cada una con la característica de reutilización. Este contenedor de base de datos se compila en una biblioteca separada (junto con otra lógica de negocios). ¿Cómo sugeriría que cambie mi diseño para mejorarlo?
Andy Hunt
+1 por el excelente contenido a pesar de su sesgo de EF ... aunque EF es más que un marco auxiliar de DB. Tienes razón sobre su intento de hacer un envoltorio para esto.
SoylentGray