GUI, BLL, DAL Organización en un proyecto

9

Estoy leyendo sobre las capas de aplicación y quiero usar este diseño en mi próximo proyecto (c #, .Net). Algunas preguntas:

  1. ¿La separación de capas se realiza a través de espacios de nombres? Project.BLL.Whatever, Project.DAL.Whatever

  2. ¿Es más apropiado separar por capas, luego componentes (Project.BLL.Component1), o por componentes, luego capas (Project.Component1.BLL)

  3. Para mi DAL, ¿esta capa está más organizada usando diferentes clases? Si todas las llamadas a la base de datos se colocan en una sola clase, no hay organización. ¿Sería mejor dividirlos con diferentes clases o espacios de nombres?

  4. ¿Son las clases DAL típicamente estáticas? Parece engorroso instanciar un objeto DAL antes de llamar a uno de sus métodos cada vez.

Se agradecería cualquier otro consejo para hacer las cosas correctamente con estas capas.

sooprise
fuente

Respuestas:

8
  1. Si. Y también asambleas.
  2. Me separaría por capas, luego por componentes.
  3. Si. Hay diferentes enfoques para esto, pero tendría un IDatabaseService (abstrayendo las diversas formas en que se llama a la base de datos; esto puede ser casi una asignación directa de ExecuteScalar / ExecuteNonQuery / ExecuteReader), y luego varias clases de acceso a datos que partición por tipo de datos. Por ejemplo, podría tener una clase UserDataAccess que tendría métodos CRUD simples que crean / modifican / eliminan objetos de usuario. Otro enfoque sería tener un objeto Usuario que tenga el CRUD incorporado.
  4. No. Eso hace que sea mucho más difícil hacer una prueba unitaria. Debe usar la inyección de dependencia para pasar dependencias al constructor de cada clase de acceso a datos (como un IDatabaseService). Luego pasaría los objetos de acceso a datos a los objetos comerciales, de esta manera:

    BusinessObject businessObject = new BusinessObject (nuevo DataAccessObject (nuevo DatabaseService ())); businessObject.PerformOperation ();

Cada objeto comercial puede necesitar múltiples objetos de acceso a datos. Su código GUI también usaría uno o más objetos comerciales. Es posible que algunos objetos comerciales no necesiten ningún objeto de acceso a datos, pero nunca deben usar el IDatabaseService directamente.

Matthew Rodatus
fuente
Entonces businessObject.PerformOperation () se vería algo así como: DataAccessObject.PerformOperation (), ya que una instancia de DataAccessObject vive en businessObject?
sooprise
1
Además, gracias por el consejo sobre la inyección de dependencia. Ese es un concepto nuevo para mí, y parece tener sentido. Tendré que aprender más al respecto :)
sooprise
@sooprise Right: sus objetos comerciales deben operar en los objetos de acceso a datos que viven como miembros privados. Me alegra que aprecies el consejo sobre la inyección de dependencia. Es un concepto crucial para el diseño de software mantenible y comprobable. ¡De nada!
Matthew Rodatus
2

Para las preguntas 1 y 2, vaya con las respuestas de Matthew.

He pasado mucho tiempo tratando de descubrir la mejor manera de estructurar el DAL de las aplicaciones de escritorio. Y la mejor manera realmente depende de las necesidades de la aplicación. En una de mis aplicaciones, tomé el camino de tener una clase DA para cada tabla de base de datos, que se registró con una clase DataProvider central (es decir, singleton) y manejó el CRUD. Cada clase de DA podría decidir si quería almacenar en caché todos los datos de la tabla en RAM o no (¡rendimiento!) Y / o si necesitaba tener la capacidad de activar actualizaciones automáticas de clientes en otros clientes que se ejecutan en otras computadoras (piense en multiusuario concurrencia). Esto hace que sea muy fácil agregar nuevas clases DAL, ya que todo lo que tienen que hacer es ajustarse a la interfaz de registro.

No todos los DAL necesitan este tipo de funcionalidad, pero aprendí que el enfoque en sí mismo (es decir, proveedor de datos singleton y clases DAL simples con registro estático) me hizo la vida mucho más fácil cuando comencé a agregar nuevas clases.

Definitivamente no recomendaría construir el CRUD en clases de nivel superior, a menos que sea una aplicación muy simple. El DAL es una abstracción del almacenamiento de datos. Si decide cambiar su almacenamiento de datos en algún momento en el futuro (incluso si es solo para usar MySQL en lugar de MS SQL), estará muy agradecido por eso. Además: los objetos BLL deben estructurarse según sus relaciones de lógica de negocios. Los objetos DAL están estructurados por los tipos de contenedores de almacenamiento que representan. Las diferencias pueden ser dramáticas.

No NO hacer su clases DAL estática. Lo que gana en la velocidad de codificación lo perderá muchas veces en capacidad de prueba y flexibilidad.

wolfgangsz
fuente
Tiene razón en que el diseño específico es impulsado por las necesidades de la aplicación. Sin embargo, a menos que malinterprete su diseño, no estoy de acuerdo con el uso de singletons. Tal vez podría explicar su enfoque más. Por qué los Singletons son malvados: blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx
Matthew Rodatus
Lo siento, pero no estoy de acuerdo con los singletons. Hay muy buenas razones para usarlos, y todas las cosas mencionadas en ese blog suenan como excusas de alguien que no quiere aplicar la disciplina necesaria a su codificación.
wolfgangsz
Una explicación detallada de mi enfoque llenaría mucho más de lo que puedo proporcionar aquí en los comentarios. Envíame tu dirección de correo electrónico y te responderé (wolfgangs en manticoreit dot com)
wolfgangsz