Estoy implementando un DAL usando el marco de entidad. En nuestra aplicación, tenemos tres capas (DAL, capa de negocios y presentación). Esta es una aplicación web. Cuando comenzamos a implementar el DAL, nuestro equipo pensó que DAL debería tener clases cuyos métodos reciban un ObjectContext dado por los servicios en la capa empresarial y operar sobre él. El fundamento de esta decisión es que diferentes ObjectContexts ven diferentes estados de DB, por lo que algunas operaciones pueden rechazarse debido a problemas con la coincidencia de claves foráneas y otras incoherencias.¿Es el patrón DTO plus UnitOfWork un buen enfoque para diseñar un DAL para una aplicación web?
Notamos que generar y propagar un contexto de objetos desde la capa de servicios genera un alto acoplamiento entre las capas. Por lo tanto, decidimos usar DTO mapeados por Automapper (entidades no administradas o entidades de auto-seguimiento que argumentan alto acoplamiento, exponiendo entidades a capas superiores y baja eficiencia) y UnitOfWork. Entonces, aquí están mis preguntas:
- ¿Es este el enfoque correcto para diseñar el DAL de una aplicación web? ¿Por qué?
- Si respondió "sí" a 1., ¿cómo se concilia el concepto de DTO con los patrones de UnitOfWork?
- Si respondió "no" a 1., ¿cuál podría ser un enfoque correcto para diseñar un DAL para una aplicación web?
Por favor, si es posible, brinde bibliografía que respalde su respuesta.
Sobre el diseño actual:
La aplicación ha sido planeado para ser desarrollado en tres capas: presentación, negocio y DAL. La capa empresarial tiene fachadas y servicios
Existe una interfaz llamada ITransaction (con solo dos métodos para deshacerse y guardar cambios) solo visible en los servicios. Para administrar una transacción, hay una Transacción de clase que extiende un ObjectContext e ITransaction. Hemos diseñado esto teniendo en cuenta que en la capa empresarial no queremos que otros métodos ObjectContext sean accesibles.
En el DAL, creamos un repositorio abstracto usando dos tipos genéricos (uno para la entidad y el otro para su DTO asociada). Este repositorio tiene métodos CRUD implementados de forma genérica y dos métodos genéricos para asignar los DTO y las entidades del repositorio genérico con AutoMapper. El constructor de repositorio abstracto toma un ITransaction como argumento y espera que ITransaction sea un ObjectContext para asignarlo a su propiedad ObjectContext protegida.
Los repositorios de hormigón solo deben recibir y devolver tipos .net y DTO.
Ahora nos enfrentamos a este problema: el método genérico para crear no genera una identificación temporal o persistente para las entidades adjuntas (hasta que usemos SaveChanges()
, rompiendo la transaccionalidad que queremos); esto implica que los métodos de servicio no pueden usarlo para asociar los DTO en el BL)
Mire la última versión de la pregunta ... ¡gracias! – JPCF
enlace pendiente ...! – JPCF