Estoy usando un enfoque similar a DDD para un módulo greenfield de una aplicación existente; no es 100% DDD debido a la arquitectura, pero estoy tratando de usar algunos conceptos DDD. Tengo un contexto acotado (creo que ese es el término apropiado, todavía estoy aprendiendo sobre DDD) que consta de dos Entidades: Conversation
y Message
. La conversación es la raíz, ya que un mensaje no existe sin la conversación, y todos los mensajes en el sistema son parte de una conversación.
Tengo una ConversationRepository
clase (aunque en realidad es más como una puerta de enlace, uso el término "repositorio") que encuentra conversaciones en la base de datos; cuando encuentra una conversación, también crea (a través de Fábricas) una lista de mensajes para esa conversación (expuesta como una propiedad). Esta parece ser la forma correcta de manejar las cosas, ya que no parece ser necesaria una MessageRepository
clase completa, ya que solo existe cuando se recupera una conversación.
Sin embargo, cuando se trata de guardar un mensaje, ¿es responsabilidad del ConversationRepository, ya que es la raíz agregada del mensaje? Lo que quiero decir es, ¿debería tener un método en ConversationRepository llamado, digamos, AddMessage
que toma un mensaje como parámetro y lo guarda en la base de datos? ¿O debería tener un repositorio separado para buscar / guardar mensajes? Lo lógico parece ser un repositorio por Entidad, pero también he escuchado "Un repositorio por Contexto".
fuente
Puede crear ConversationService e inyectar IConversationRepository e IMessageRepository en su constructor. Utilice repositorios para operaciones CRUD simples y servicios para todo lo demás (almacenamiento en caché, lógica de guardado, etc.)
fuente