Estou usando uma abordagem semelhante ao DDD para um módulo greenfield de um aplicativo existente; não é 100% DDD devido à arquitetura, mas estou tentando usar alguns conceitos de DDD. Eu tenho um contexto limitado (acho que esse é o termo apropriado - ainda estou aprendendo sobre DDD), composto por duas entidades: Conversation
e Message
. A conversa é a raiz, pois uma Mensagem não existe sem a conversa e todas as mensagens no sistema fazem parte de uma conversa.
Eu tenho uma ConversationRepository
classe (embora seja realmente mais como um Gateway, eu uso o termo "Repositório") que encontra Conversas no banco de dados; quando encontra uma conversa, também cria (via fábricas) uma lista de mensagens para essa conversa (exposta como uma propriedade). Essa parece ser a maneira correta de lidar com as coisas, pois não parece haver necessidade de uma MessageRepository
classe completa, pois ela só existe quando uma Conversa é recuperada.
No entanto, quando se trata de salvar uma mensagem, é responsabilidade do ConversationRepository, pois é a raiz agregada da mensagem? O que quero dizer é que eu deveria ter um método no ConversationRepository chamado, digamos, AddMessage
que pega uma mensagem como parâmetro e a salva no banco de dados? Ou devo ter um repositório separado para localizar / salvar mensagens? A coisa lógica parece ser um repositório por entidade, mas também ouvi "Um repositório por contexto".
fonte
Você pode criar o ConversationService e injetar o IConversationRepository e IMessageRepository em seu construtor. Use repositórios para operações CRUD simples e serviços para todo o resto (armazenamento em cache, economia de lógica etc.)
fonte