Conexión de una capa empresarial y un repositorio utilizando el patrón de unidad de trabajo


8

Mi pregunta es similar a esta sobre Stack Overflow: ¿Cuál es la forma correcta de usar la Unidad de Trabajo / Repositorios dentro de la capa empresarial?

Guión:

  • Solución .Net
  • IRepository utilizado para recuperar objetos de DB
  • IUnitOfWork solía permitir transacciones en múltiples repositorios

Esto tiene sentido para mí y he implementado algo en este sentido que funciona bien. Ahora quiero introducir una capa de lógica de negocios y estoy teniendo problemas para organizar los tres elementos (BLL, UnitOfWork y Repository) en mi mente.

Mi punto de vista:

  • Repositorio - recuperación de datos, manipulación
  • UnitOfWork - persistencia
  • BLL: lógica relevante para el negocio ('mundo real') (¡no me gusta ese término!)

Considere que tenemos una interfaz ASP.Net MVC.

¿Cómo se ve un BLL y cómo se ve el controlador MVC que lo usa?

Como referencia: me pregunto si quizás mi implementación IUnitOfWork / IRepository podría ser la causa subyacente de mi confusión.

public class IRepository<T> 
{
    private IObjectSet<T> objSet;
    public IRepository<T>(IUnitOfWork uow)
    {
        objSet = uow.CreateObjectSet<T>();
    }

    public IQueryable<T> Add(T entity)
    {
        objSet.Add(entity);
    }
    //etc. etc. for delete, attach, getall
}

Entonces siento que si tengo un BLL, debería pasarle el IUnitOfWork, para que pueda usarlo para crear las instancias de IRepository que necesita. Pero, ¿cómo "sabrá" el BLL (DLL separado del front-end) qué implementación de IRepository construir?


2
De hecho, pensé que tu pregunta estaba bien. El problema es que esta es un área borrosa; no hay One True Way ™ para hacerlo, y nadie quiere darte sugerencias porque no quieren que se les diga que lo están haciendo mal. Personalmente, prefiero un enfoque más delgado y más centrado en la tabla de base de datos en proyectos más pequeños; Toda esta ceremonia está realmente destinada a aplicaciones empresariales a gran escala.
Robert Harvey

Los puntos justos ambos y la culpa es entonces con mi redacción. Me interesaban las opiniones personales, es decir, "así es como lo abordaría personalmente".
glosrob

Respuestas:


5

Tenga en cuenta que solo tengo poca experiencia con el marco .NET y que esta respuesta solo se refiere a la parte de arquitectura de su pregunta.

Según tengo entendido, básicamente está aplicando los siguientes patrones arquitectónicos en su aplicación:

Capas: Parece que tiene una capa de persistencia (Patrón de repositorio), una capa de lógica de negocios y una capa de vista.

Modelo-Vista-Controlador: Este patrón se aplica en la capa de vista usando ASP.NET MVC.

Supongo que la pregunta es: ¿cómo se ve un BLL y cómo se ve el controlador MVC que lo usa?

En primer lugar, esta arquitectura está diseñada para aplicaciones empresariales a gran escala, como Robert Harvey mencionó en su comentario a su pregunta. Lo que es característico de tales sistemas es que la lógica de dominio (que encapsuló en la capa de lógica de negocios) debe ser accesible a través de varias interfaces.

Considere Twitter, por ejemplo: Twitter podría tener una capa de lógica de negocios que proporciona servicios para registrar y validar usuarios, publicar tweets y mucho más. Además de esta capa de lógica de negocios, podrían existir varios otros componentes en la capa de vista, por ejemplo, una interfaz web y un componente de servicio web. Como toda la lógica de negocios está encapsulada en la capa de lógica de negocios, puede seguir el principio DRY y mejorar la capacidad de mantenimiento y otros atributos de calidad.

Para volver a su pregunta, debe encapsular la lógica empresarial y el acceso a datos en el BLL. El controlador (piense en MVC) debe hacer uso de BLL y no debe tener acceso directo a la base de datos. Considere la capa de vista como una interfaz para su aplicación.

Entonces siento que si tengo un BLL, debería pasarle el IUnitOfWork, para que pueda usarlo para crear las instancias de IRepository que necesita. Pero, ¿cómo "sabrá" el BLL (DLL separado del front-end) qué implementación de IRepository construir?

El BLL debe saber qué repositorio (¿fuente de datos?) Utiliza. Las capas de arriba no deberían controlar esto. Nuevamente, considere la capa de vista solo como una interfaz para su lógica de negocios.

Si no necesita la sobrecarga de una capa de lógica de negocios, también puede optar por usarla únicamente para el acceso a datos en forma de objetos de acceso a datos .

Espero que esto haya ayudado a aclarar las responsabilidades de los diversos componentes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.