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.
fonte
Eu não conheço EF6, mas outro ORM lida com isso de forma transparente, para que você não precise adicionar explicitamente as licenças ao contexto, ele as detectará ao salvar as alterações. Portanto, o método será reduzido para
e o código ao seu redor
fonte