Pido disculpas por adelantado si la gente piensa que esto ha sido golpeado hasta la muerte. Acabo de pasar las últimas horas buscando y leyendo muchos mensajes excelentes aquí en SO, pero todavía estoy confundido.DDD, repositorio y encapsulación
El origen de mi confusión es DTO contra DDD y repositorios. Quiero que mis objetos de dominio POCO tengan inteligencia, y quiero obtenerlos de los repositorios. Pero parece que tengo que violar algunas reglas de encapsulación para que funcione, y parece que puede convertir los DTO en sus cabezas.
Aquí hay un ejemplo simple: en nuestra aplicación de catálogo, una Parte podría ser un paquete que incluye una cantidad de otras partes. Entonces, tiene sentido que la Parte POCO tenga un método 'GetChildren()' que devuelve IEnumerable < Parte>. Incluso podría hacer otras cosas con la lista cuando se vaya.
Pero, ¿cómo se resuelve esa lista? Parece que el repositorio es la respuesta:
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
Y
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
Así que ahora los consumidores de mi catálogo, además de (correctamente) partes de carga desde el repositorio, también puede pasar por alto algunos Parte-encapsulados lógica llamando a GetChildren (parte) directamente. ¿No es malo?
He leído que los repositorios deberían servir para POCO pero que los DTO son buenos para transferir datos 'entre capas'. Se calculan muchas propiedades de piezas: los precios, por ejemplo, se calculan en base a reglas de precios complejas. Un precio ni siquiera estará en un DTO proveniente de un repositorio, por lo que parece que pasar los datos de fijación de precios a un servicio web requiere que el DTO consuma la Parte, y no al revés.
Esto ya es demasiado largo. ¿Dónde está mi cabeza desenroscada?
Interesante. Pero estoy confundido por 'mover GetChildren (parte) en IPartService y eliminarlo de la parte' y luego 'La clase Part todavía tiene una propiedad Childparts'. ¿Qué pasa si parte necesita dar masajes a sus hijos por alguna razón? – n8wrl
Si el masaje debe suceder inmediatamente cuando lo recupere del repositorio, pondría esa lógica en 'IPartService.GetChildren()'. Si necesita poder modificar las partes secundarias en momentos arbitrarios, podría hacer otro método de servicio, como 'IPartService.UpdateChildPartPrices (Parte parte) .' (O ambas, podría llamar' UpdateChildPartPrices' de 'GetChildren'). –
¡Gracias por tomarse el tiempo, Jeff! – n8wrl