Estou em um projeto trabalhando com DDD, estou com algumas dúvidas, já li vários post, mas não sanaram minhas dúvidas, pode ser algo relativamente simples, mas que não consegui tomar a decisão de qual abordagem seguir. A dúvida vem quando chega nos famosos repositórios, onde trabalho com Entity Framework. Nos projetos que trabalhei anteriormente(não era DDD), ao necessitar realizar uma alteração, solicitava a alteração ao repositório do meu objeto principal. Exemplo, tenho minha duas entidades: Pessoa e ContatoEletronico, possuia um repositório para Pessoa, no método de update no meu repositório de pessoa, buscava todos os contatos eletrônicos da pessoa que esta sendo alterada, comparava com a coleção de contatos que esta na Pessoa alterada, para saber qual contato eletrônico necessito inserir, alterar ou deletar, ainda no meu repositório setava para cada objeto o que ele deveria fazer, informando ao EF o que deveria ser feito para cada objeto, exemplo: (contexto.Entry(itemContato).State = System.Data.EntityState.Deleted;, este comando esta encapsulado em um repositório genérico).
Pensando em um projeto em DDD hoje, o que eu faria(iniciando desde o camada de serviço de aplicação).
A Camada de serviço de aplicação possui um método de AtualizarPessoa(PessoaDTO pessoa), será convertido o objeto pessoa utilizando uma factory, faria minhas validações, após isto acionaria o meu repositório de Pessoa que seria minha raiz de agregado, e faria o mesmo processo que faria no repositório que expliquei acima. Mas daí que vem um problema, pra eu executar esta rotina no meu repositório (buscar o que deve ser inserido, excluído ou deletado e seta-lo para que o entity saiba o que fazer), eu deixaria uma abertura, se no repositório de pessoa, fosse instanciado um objeto ContasAReceber, e setá-lo para inserir, iria funcionar, mas fica errado relacionado ao DDD. Uma idéia foi, somente o raiz de agregado possuir um repositório(a raíz de agregado herda de uma interface IAggregate) e o repositório é tipado com esta interface, então quando salvo a pessoa, só acionaria o pessoaRepository.Save(), o problema é que para o ORM's, você precisa falar o que ele deve fazer ao alterar suas coleções, ao salvar pessoa, ele não sabe, se tem que excluir algum contato, alterar etc. Vocês já passaram por isso? tem alguma sugestão para me dar? Vocês concordam que a responsabilidade de setar quem vai ser inserido, alterado e excluído é do repositório, pois isto só interessaria ao ORM. Li vários artigos falando que devemos deixar explícito o que você qr que seja feito, setando a inclusão, alteração, exclusão de cada objeto na collection, mas não vejo uma forma de fazer isto e não deixar aberto para para que o repositório de pessoa por exemplo, faça manutenção em uma entidade que não faça parte da sua composição.
Agradeço desde já.