Los problemas que está viendo no son causados por el Diseño Dirigido por Dominio, sino más bien por la falta de separación de las preocupaciones. El Diseño Dirigido por Dominio no se trata solo de colocar datos y comportamiento en conjunto.
Lo primero que recomendaría es tomar un día y leer Domain Driven Design Quickly disponible como descarga gratuita desde Info-Q. Esto proporcionará una descripción general de los diferentes tipos de objetos de dominio: entidades, objetos de valor, servicios, repositorios y fábricas.
Lo segundo que recomendaría es leer en el Single Responsibility Principle.
Lo tercero que recomendaría es que empiece a sumergirse en Test Driven Development. Si bien aprender a diseñar al escribir pruebas primero no necesariamente hará que los diseños sean geniales, tienden a guiarlo hacia diseños poco compactos y a revelar problemas de diseño más temprano.
En el ejemplo que proporcionó, WebsiteUser definitivamente tiene demasiadas responsabilidades. De hecho, es posible que no necesite WebsiteUser
, ya que los usuarios generalmente están representados por un ISecurityPrincipal
.
Es un poco difícil sugerir exactamente cómo debe acercarse a su diseño dada la falta de contexto comercial, pero primero recomendaría hacer una tormenta de ideas creando algunas fichas que representen cada uno de los sustantivos principales que tiene en su sistema (por ejemplo, cliente, orden, recibo, producto, etc.). Escriba los nombres de las clases candidatas en la parte superior, qué responsabilidades considera que son inherentes a la clase a la izquierda y las clases con las que colaborará a la derecha. Si algún comportamiento no parece pertenecer a ninguno de los objetos, es probable que sea un buen candidato para el servicio (es decir, AuthenticationService).Extiende las cartas sobre la mesa con tus universidades y discute. Sin embargo, no hagas demasiado de esto, ya que esto solo pretende ser un ejercicio de diseño de tormenta de ideas. Puede ser un poco más fácil hacer esto a veces que usar una pizarra porque puedes mover cosas.
A largo plazo, realmente deberías retirar el libro Domain Driven Design de Eric Evans. Es una gran lectura, pero vale la pena su tiempo. También te recomendaría que retires Agile Software Development, Principles, Patterns, and Practices o Agile Principles, Patterns, and Practices in C# dependiendo de tu preferencia de idioma.
Gracias por este comentario. He leído el libro del Sr. Evans. Supongo que el problema es cuando una entidad tiene muchos colaboradores. p.ej. un usuario del sitio web (o el principal) tiene un último pedido, un primer pedido, un carrito de compras, una contraseña, etc. Todos estos están directamente relacionados con el usuario de un sitio web. – Pablojim
La autenticación, el estado de pedido pendiente (es decir, el carrito de compras) y el historial de pedidos son preocupaciones realmente diferentes. Considere extraer la autenticación en un IAuthenticationService y crear un IOrderHistoryRepository (o quizás un IOrderHistoryService) para encapsular el comportamiento de recuperación del historial de pedidos para un usuario determinado. –