design-patterns repository data-access-layer business-logic-layer

design patterns - Diseño de DAL y BLL-Repositorio de datos único/múltiple para las tablas relacionadas



design-patterns repository (1)

Al diseñar una nueva aplicación de varios niveles, me enfrenta una dificultad para tomar una decisión sobre mi diseño de capa DAL y BLL .

Supongamos que tengo información de empleado diseminada en múltiples tablas que tienen una relación 1-1 y 1-Many con la tabla maestra. Pocos se enumeran a continuación:

Empleado (Tabla Maestra),
Employee_Contact_Detail,
Employee_Education,
Employee_Skill,
Employee_Experience

En el nivel DAL, tengo un repositorio de datos genéricos que proporciona funcionalidades comunes como GetAll, GetSingle, Add, Edit, Delete para cada tabla.

Ahora, ¿debería diseñar mi "Repositorio de Datos de Empleados" derivado de mi "Repositorio de Datos Genéricos" y agregar funciones para todas las tablas relacionadas listadas arriba en una sola clase como GetEmployeePersonalDetail, GetEmployeeContactDetail, GetEmployeeEducation, AddEmployeePersonalDetail, EditEmployeePersonalDetail etc. De esta manera ganaría muy menos beneficio para el "Repositorio de Datos Genéricos". La otra forma es que creo (y derivo de Generic Repository) un repositorio de datos separado para cada tabla y luego creo una sola clase en la capa de lógica de negocios para "Empleado".

EDITAR

Si utilizo la opción "repositorio de datos separado para cada tabla", en el nivel DAL y luego en lugar de "clase de lógica de negocios única" para "Empleado", si creo clases de lógica de negocios separadas, correspondientes a cada repositorio de datos, ¿será enfoque indecente teniendo en cuenta el escenario?

Muchas gracias por su guía.


Como se mencionó en el comentario de su pregunta, esta es mi opinión.

Problema:

Si ya tiene un repositorio base, ¿por qué crear un repositorio específico para cada tabla? De nuevo, en BLL, está creando una clase de Service separada ("clase de lógica de negocios" como mencionó) para cada repositorio. Todo esto es un trabajo repetitivo y difícil de manejar y entender.

Sugerencia:

No ha mencionado qué ORM (si lo hay) está utilizando; así que supongo que su ORM proporciona las características necesarias para implementar la arquitectura a continuación.
Te sugiero que cierres tu DAL en el repositorio genérico. No escriba clases DAL para tablas específicas. Todas sus clases de Servicio utilizarán DAL genérico para funciones CRUD básicas. Toda la funcionalidad extendida debe implementarse en la clase de servicio en sí.

Acerca de las clases de servicio, en lugar de crear una clase para cada Repositorio / Tabla, nuevamente se repite el trabajo. Mejor agrupa tus tablas múltiples relacionadas (el repositorio está fuera de cuestión con referencia al párrafo anterior) en un solo servicio.

Por ejemplo, crea DAL genérico que sirve funcionalidad básica para todas las tablas. Crea EmployeeService que cubre todas las tablas relacionadas con sus empleados. Usted crea AccountService que cubre toda su tabla relacionada con la contabilidad. Del mismo modo, LogService para todas las actividades relacionadas con el registro. Esto facilita la interacción con los servicios al obtener todos los miembros relacionados en una clase. Esto también reduce el trabajo repetido.

Remita mi esto y estas preguntas y sus respuestas aceptadas.

Espero que esto explique tu preocupación.

Editar 1

Como mencioné en tu comentario, tú usas EF. Es compatible con las características necesarias para implementar lo que sugerí.

implementar funcionalidad extendida en BLL en lugar de DAL se superpondrá a los roles de nivel

Sí; lo hace. Otro lado también es lo mismo. Cuando escribe DAL para cada tabla, en realidad está filtrando Business Logic en DAL. En caso de cualquier cambio en Business Logic, debe modificar DAL que no tiene sentido.
En mi sugerencia, aunque las capas se superponen, las preocupaciones aún están separadas. DAL solo maneja CRUD. BLL maneja toda la lógica, incluida la lógica de la base de datos.

¿Has usado la misma estrategia en cualquiera de tus proyectos?

Sí. En algunos proyectos anteriores, creaba DAL por separado para cada tabla en lugar de DAL genérico. Esto causó un gran trabajo de repetición. Aunque los proyectos fueron relativamente pequeños, los gastos generales de mantenimiento fueron más. Pocos meses atrás, comencé con un proyecto relativamente grande donde implementé lo que sugerí arriba. Podemos ver el alivio que nos dio ahora.