Eu vim de um mundo de scripts de transações e estou apenas começando a dar uma olhada no DDD. Não tenho certeza da maneira correta de integrar um design DDD à persistência do banco de dados. Isto é o que eu tenho:
Uma classe de serviço chamada OrganisationService cuja interface contém métodos para recuperar e salvar instâncias de objetos de domínio da Organização. A organização é uma raiz agregada e possui outros dados relacionados a ela: Membros e licenças. O primeiro DBContext do banco de dados EF6 é usado no OrganisationService para recuperar entidades do OrganisationDB e as entidades MemberDB e LicenseDB relacionadas. Todos eles são transformados em seus equivalentes de classe de objeto de domínio quando recuperados pelo OrganisationService e carregados no objeto de domínio da Organização. Este objeto tem a seguinte aparência:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Não estou usando o padrão Repository no OrganisationService ... Estou usando o próprio EF como repositório, pois parece que o EF6 tornou o repositório redundante agora.
Nesse ponto do design, o objeto de domínio da organização é anêmico: parece com a classe de organização EF POCO. A classe OrganisationService se parece muito com um Repositório!
Agora eu preciso começar a adicionar lógica. Essa lógica inclui o gerenciamento de licenças e membros de organizações. Agora, nos dias de script de transação, eu adicionava métodos ao OrganisationService para manipular essas operações e chamava um Repositório para interagir com o DB, mas com o DDD acredito que essa lógica deve ser encapsulada no próprio objeto de domínio da Organização ...
É aqui que não tenho certeza do que devo fazer: precisarei persistir esses dados de volta ao banco de dados como parte da lógica. Isso significa que devo usar o DbContext no objeto de domínio da organização para fazer isso? O uso do repositório / EF dentro do objeto de domínio é uma prática ruim? Em caso afirmativo, a que lugar pertence essa persistência?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
Em vez disso, devo apenas alterar o objeto de domínio da organização na memória e enviá-lo de volta ao OrganisationService para persistência? Então, eu tenho que rastrear o que realmente mudou no objeto (que é o que a EF faz em seus próprios POCOs! Estou começando a achar que a EF não é apenas uma substituição de repositório, mas também pode ser a camada de domínio!)
Qualquer orientação aqui é apreciada.