Aggregate Root na modelagem de domínios ricos

Renato Gontijo
3 min readOct 8, 2020

--

O DDD (Domain-Driven Design) surgiu com a intenção de melhorar a modelagem das aplicações, auxiliando na construção de softwares mais aderentes ao mundo real e às operações de negócio.

Um padrão muito utilizado no DDD é o padrão agreggate, que auxiliar no agrupamento de funcionalidades de um objeto de domínio partindo sempre de uma raiz de agregação (aggregate root). Uma raiz de agregação é responsável por gerenciar os objetos de domínio filhos e garantir que os dados serão sempre salvos em conjunto, sendo assim, o repositório terá acesso somente a raiz de agregação e não aos objetos filhos.

Pode parecer um pouco complicado, mas este padrão auxilia muito na construção de domínios mais aderentes ao negócio, além de facilitar muito a construção de testes.

show me the code!

Bem, para facilitar o entendimento, vamos a um exemplo didático de uma funcionalidade utilizando uma raíz de agregação.

Preciso de um modelo onde consiga desenhar as áreas de uma fazenda georreferenciadas. Neste exemplo serão utilizados duas entidades Área Fazenda (FarmArea) e Áreas Coordenadas (FarmAreaCoordinates).

Entities
FarmArea Entity
FarmAreaCoordinate Entity

A raíz de agregação neste modelo é a entidade FarmArea, que será responsável por manipular e validar as entidades filhas, neste caso FarmAreaCoordinate. Isto garante que tenhamos sempre modelos e regras alinhadas ao negócio. Por exemplo, toda área deve ser identificada por um nome e para que seja possível desenhar a área em um mapa do satélite, devo ter no mínimo 3 coordenadas diferentes para desenhar um polígono.

Show the code!

Nesta abordagem cada entitdade é responsável por se validar, de forma a garantir dados consistentes e evitar que sejam persistidos dados inválidos na aplicação. Para a validação, foi utilizado o conceito de AssertionConcern do Vernon.

As entidades de repositório devem receber apenas a raiz de agregação (FarmArea), de forma que as entidades filhas serão persistidas a partir dela.

Repo using AggregateRoot

Neste caso pode ser utilizado apenas uma interface de marcação (IAggregateRoot) para garantir que o repositório somente receberá a entidade que é uma raíz de agregação.

Como as regras estão todas contidas dentro dos objetos de domínio, é possível desenhar testes para validar as regras de negócio, sem necessidade da criação de mocks de repositório, permitindo desenhar testes relativamente pequenos e que permitam de fato validar as funcionalidades do domínio.

O exemplo de código completo pode ser visto aqui.

Referências:

--

--

No responses yet