O que é uma raiz agregada?
-
21-09-2019 - |
Pergunta
Estou tentando entender como usar corretamente o padrão de repositório. O conceito central de uma raiz agregada continua surgindo. Ao pesquisar a Web e o Stack Overflow em busca de ajuda com o que é uma raiz agregada, continuo encontrando discussões sobre elas e links mortos para páginas que devem conter definições básicas.
No contexto do padrão do repositório, O que é uma raiz agregada?
Solução
No contexto do padrão do repositório, as raízes agregadas são os únicos objetos que o código do cliente carrega do repositório.
O repositório encapsula o acesso a objetos infantis - da perspectiva de um chamador, ele os carrega automaticamente, ao mesmo tempo em que a raiz é carregada ou quando é realmente necessária (como no carregamento preguiçoso).
Por exemplo, você pode ter um Order
objeto que encapsula operações em múltiplos LineItem
objetos. O código do seu cliente nunca carregaria o LineItem
objetos diretamente, apenas o Order
Isso os contém, que seria a raiz agregada para essa parte do seu domínio.
Outras dicas
De Evans DDD:
Um agregado é um cluster de objetos associados que tratamos como uma unidade para fins de alterações de dados. Cada agregado tem uma raiz e um limite. O limite define o que está dentro do agregado. A raiz é uma entidade única e específica contida no agregado.
E:
A raiz é o único membro do agregado que objetos externos podem manter referências a [.
Isso significa que as raízes agregadas são os únicos objetos que podem ser carregados de um repositório.
Um exemplo é um modelo contendo um Customer
entidade e um Address
entidade. Nós nunca acessaríamos um Address
entidade diretamente do modelo, pois não faz sentido sem o contexto de um associado Customer
. Então poderíamos dizer isso Customer
e Address
juntos formam um agregado e que Customer
é uma raiz agregada.
Raiz agregada é um nome complexo para uma idéia simples.
Ideia geral
O diagrama de classes bem projetado encapsula seus internos. Ponto através do qual você acessa essa estrutura é chamado aggregate root
.
Os internos da sua solução podem ser muito complicados, mas o usuário dessa hierarquia apenas usará root.doSomethingWhichHasBusinessMeaning()
.
Exemplo
Verifique esta hierarquia de classe simples
Como você quer andar de carro? Escolheu a API melhor
Opção A (de alguma forma funciona):
car.ride();
Opção B (o usuário tem acesso aos INERNALS da classe):
if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
for (Wheel w: car:getWheels()){
w.spin();
}
}
Se você acha que essa opção A é melhor do que parabéns. Você fica com principal razão para trás aggregate root
.
Agregar a raiz encapsula várias classes. Você pode manipular a hierarquia inteira apenas através do objeto principal.
Imagine que você tem uma entidade de computador, essa entidade também não pode viver sem sua entidade de software e entidade de hardware. Estes formam o Computer
agregado, o mini-ecossistema para a parte do computador do domínio.
Raiz agregada é a entidade da nave -mãe dentro do agregado (no nosso caso Computer
), é uma prática comum fazer com que seu repositório trabalhe apenas com as entidades que são raízes agregadas, e essa entidade é responsável por inicializar as outras entidades.
Considere a raiz agregada como um ponto de entrada para um agregado.
No código C#:
public class Computer : IEntity, IAggregateRoot
{
public Hardware Hardware { get; set; }
public Software Software { get; set; }
}
public class Hardware : IEntity { }
public class Software : IValueObject { }
public class Repository<T> : IRepository<T> where T : IAggregateRoot {}
Lembre -se de que o hardware provavelmente também seria um ValueBject (não tem identidade por conta própria), considere -o apenas como um exemplo.
Se você seguir uma abordagem de banco de dados, sua raiz agregada geralmente é a tabela no lado 1 de um relacionamento 1-muitos.
O exemplo mais comum é uma pessoa. Cada pessoa tem muitos endereços, um ou mais pistas de pagamento, faturas, entradas de CRM etc. Nem sempre é o caso, mas 9/10 vezes é.
No momento, estamos trabalhando em uma plataforma de comércio eletrônico e basicamente temos duas raízes agregadas:
- Clientes
- Vendedores
Os clientes fornecem informações de contato, atribuímos transações a eles, as transações recebem itens de linha etc.
Os vendedores vendem produtos, têm pessoas de contato, sobre páginas, ofertas especiais, etc.
Estes são atendidos pelo repositório de clientes e vendedores, respectivamente.
A partir de um link quebrado:
Dentro de um agregado, há uma raiz agregada. A raiz agregada é a entidade pai de todas as outras entidades e objetos de valor no agregado.
Um repositório opera em uma raiz agregada.
Mais informações também podem ser encontradas aqui.
Agregar significa coleção de algo.
raiz é como um nó de árvore superior, de onde podemos acessar tudo como <html>
Nó no documento da página da web.
Analogia do blog, um usuário pode ter muitas postagens e cada postagem pode ter muitos comentários. Então, se buscarmos algum usuário, ele pode agir como raiz Para acessar todas as postagens relacionadas e outros comentários dessas postagens. Todos estes são considerados coleta ou Agregado
O agregado é onde você protege seus invariantes e force a consistência, limitando sua raiz agregada de pensamento de acesso. Não se esqueça, o agregado deve projetar as regras e invariantes do seu projeto, não o relacionamento com o banco de dados. Você não deve injetar nenhum repositório e nenhuma dúvida não é permitida.
Em Erlang, não há necessidade de diferenciar entre agregados, uma vez que o agregado é composto por estruturas de dados dentro do estado, em vez da composição OO. Veja um exemplo: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london