O que é uma raiz agregada?

447

Estou tentando entender como usar corretamente o padrão de repositório. O conceito central de uma raiz agregada continua aparecendo. Ao pesquisar na Web e no Stack Overflow para obter ajuda com o que é uma raiz agregada, continuo encontrando discussões sobre eles e links inativos para páginas que deveriam conter definições básicas.

No contexto do padrão do repositório, o que é uma raiz agregada?

Dinah
fonte
16
Considere revisar os seguintes estudos de caso. Eficaz Aggregate Projeto Parte I: Modelando um único agregado dddcommunity.org/wp-content/uploads/files/pdf_articles/... Parte II: Fazendo Agregados Work Together dddcommunity.org/wp-content/uploads/files/pdf_articles/... Parte III: Obtendo informações através da descoberta dddcommunity.org/wp-content/uploads/files/pdf_articles/…
Ben Vitale

Respostas:

310

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 filho - da perspectiva de um chamador, ele os carrega automaticamente, ao mesmo tempo em que a raiz é carregada ou quando eles são realmente necessários (como no carregamento lento).

Por exemplo, você pode ter um Orderobjeto que encapsule operações em vários LineItemobjetos. Seu código de cliente nunca carregaria os LineItemobjetos diretamente, apenas o Orderque os contém, que seria a raiz agregada para essa parte do seu domínio.

Jeff Sternal
fonte
21
Hipoteticamente, se o código do cliente precisasse o LineItem para algum outro propósito, isso formaria um agregado separado (supondo que haveria outros objetos envolvidos não relacionados ao objeto Order)?
Ahmad
20
@ Ahmad, outros agregados podem se referir a LineItems como dados somente leitura, eles simplesmente não podem alterá- los. Se outros agregados pudessem alterá-los, você não poderia proteger os invariantes do pedido (nem os itens de linha).
Jeff Sternal
4
Veja isto, por exemplo, lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… . No exemplo, o Cliente é invariável do Pedido, certo? No entanto, o cliente também pode ser a outra raiz agregada? Ou estou perdendo algum entendimento fundamental aqui?
Ahmad
3
@ Jeff Você disse que "eles simplesmente não podem mudá-los" - isso é aplicável ou é uma questão de convenção?
Neil Barnwell
4
@ Neil: eu aplicaria usando qualquer mecanismo de linguagem disponível - por exemplo, criando uma classe imutável para representar os dados.
Jeff Sternal
206

Partida Evans DDD:

Um AGGREGATE é um cluster de objetos associados que tratamos como uma unidade com a finalidade de alterar dados. Cada AGGREGATE tem uma raiz e um limite. O limite define o que está dentro do AGGREGATE. A raiz é uma ENTIDADE única e específica contida no AGREGADO.

E:

A raiz é o único membro do AGGREGATE que objetos externos têm permissão para 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 que contém uma Customerentidade e uma Addressentidade. Nunca acessaríamos uma Addressentidade diretamente do modelo, pois não faz sentido sem o contexto de um associado Customer. Então poderíamos dizer que Customere Addressjuntos formam um agregado e que Customeré uma raiz agregada.

Jason
fonte
57
Atualização de Eric Evans : enfatize que as raízes agregadas são limites de consistência para transações / simultaneidade e enfatize que entidades externas não podem conter referências a entidades filho de outras agregadas.
Brian Low
3
Então o palavreado está sempre me confundindo. Each AGGREGATE has a roote The root is the only *member* of the AGGREGATE- esse verbage implica que a raiz é propriedade no agregado. Mas em todos os exemplos, é o contrário: a raiz contém propriedades que são agregadas. Você pode esclarecer?
Sinaesthetic
1
Apenas para acertar meu idioma, a Customerclasse é considerada a raiz agregada ou Customer instâncias ?
21416 Joe
1
De um modo geral, no paradigma do item de linha do pedido do cliente, o cliente seria a raiz agregada. A instância de um cliente seria uma instância dessa raiz agregada. Ao falar de uma Raiz Agregada chamada Cliente, você está discutindo a construção lógica de um Cliente que compõe a instância de um cliente. Uma coleção de Clientes é apenas uma coleção.
Ibrahim Malluf
111

Raiz agregada é um nome complexo para uma ideia simples.


Ideia geral

Um diagrama de classes bem projetado encapsula seus elementos internos. O ponto através do qual você acessa essa estrutura é chamado aggregate root.

insira a descrição da imagem aqui

As partes internas da sua solução podem ser muito complicadas, mas o usuário dessa hierarquia apenas usará root.doSomethingWhichHasBusinessMeaning().


Exemplo

Verifique esta hierarquia de classes simples insira a descrição da imagem aqui

Como você quer andar de carro? Escolha melhor API

Opção A (de alguma forma funciona):

car.ride();

Opção B (o usuário tem acesso à classe interna):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

Se você acha que a opção A é melhor, parabéns. Você fica com o principal motivo por trás aggregate root.


A raiz agregada encapsula várias classes. você pode manipular toda a hierarquia apenas através do objeto principal.

Marcin Szymczak
fonte
17
Gosto do exemplo, mas estou lutando para encontrar um cenário no qual o Cliente deve fazer referência ao mecanismo. Parece que o motor deve ser encapsulado atrás do carro. Você pode elaborar um pouco sobre isso?
Emragins 29/10/2015
Na minha opinião, o próprio motor deve estar dentro de um modelo específico de carro, por exemplo, um BMW série 5 com motor de 3000cc. Com esta modelagem, o motor é um componente para um carro.
Parama Dharmika
1
@ParamaDharmika claro, você pode modelá-lo dessa maneira. Isso depende de quão 'avançados' com os carros são seus clientes. No modelo básico, ele deve ter acesso à carraiz agregada. Você também pode permitir situações como uma no desenho. A solução correta depende do modelo de negócios do aplicativo. Pode ser diferente em cada caso.
Marcin Szymczak
1
@MarcinSzymczak correta, não poderia concordar mais que a solução é depender do próprio modelo de domínio
Parama Dharmika
Na verdade, a roda é um agregado que contém pneus (e outras partes). Se suas regras exigirem que o agregado Wheel possa ser acessado apenas por meio do agregado raiz do carro, o mecanismo também estará contido no agregado raiz do carro e não deverá ser acessado fora do carro. Isso está no domínio de uma instância de carro. O proprietário de um carro (Cliente) não faria referência a um mecanismo, exceto no contexto de seu carro.
Ibrahim Malluf
35

Imagine que você tem uma entidade de computador, essa entidade também não pode viver sem sua entidade de software e de hardware. Estes formam o Computeragregado, o mini-ecossistema da parte Computer do domínio.

A Raiz Agregada é a entidade da mãe-mãe dentro do agregado (no nosso caso Computer), é uma prática comum que seu repositório funcione 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 ValueObject (não possui identidade por conta própria), considere-o apenas como um exemplo.

Francisco Aquino
fonte
6
where T : IAggregateRoot- Este fez o meu dia
Cristian E.
A redação é um pouco contraditória, eu acho, e é isso que me confunde ao tentar aprender isso. Você está dizendo que o Computador é o agregado, mas está dizendo que a raiz seria a entidade da nave-mãe DENTRO do agregado. Então, qual é a entidade "nave mãe" dentro do agregado neste exemplo?
Sinaesthetic
Saudações do futuro! O que o cara quer dizer é que o Computador, por si só, é a raiz agregada, enquanto o computador E tudo o que está dentro dele é o agregado. Ou mais claramente: o caso por si só é a raiz agregada, enquanto o computador inteiro é o agregado (a coleção de tudo o que compõe o "computador, por exemplo, iluminação RGB, hardware, fonte de alimentação, SO, etc.)
Capitão Kenpachi
A técnica IAggregateRoot aparece na documentação da Microsoft: docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson
16

Se você seguir uma abordagem baseada no primeiro banco de dados, a raiz agregada geralmente será a tabela no lado 1 de um relacionamento 1-many.

O exemplo mais comum é uma pessoa. Cada pessoa tem muitos endereços, um ou mais recibos 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:

  1. clientes
  2. Vendedores

Os clientes fornecem informações de contato, atribuímos transações a eles, as transações obtêm itens de linha etc.

Os vendedores vendem produtos, têm pessoas de contato, páginas sobre nós, ofertas especiais etc.

Eles são tratados pelo repositório Customer e Seller, respectivamente.

Capitão Kenpachi
fonte
8
Se você seguir uma abordagem baseada no banco de dados, não estará praticando o Design Orientado a Domínio, seguirá o Design Orientado a Dados.
Sinaesthetic
5
É um fórum de perguntas e respostas onde as pessoas vêm para resolver problemas e / ou aprender - não fui eu que cutucou você. Por definição, o DDD é uma mentalidade mais do que qualquer outra coisa e é confuso para muitos, portanto, fui eu que assegurei que o comentário foi feito para aqueles que estão aprendendo o DDD em um esforço para ajudar a mitigar qualquer possível fusão de metodologias de design.
Sinaesthetic
12

Dinah:

No contexto de um repositório, a raiz agregada é uma entidade sem entidade pai. Ele contém zero, uma ou muitas entidades filhas cuja existência depende do pai para sua identidade. Esse é um relacionamento Um para Muitos em um Repositório. Essas entidades filhas são agregados simples.

insira a descrição da imagem aqui

Ibrahim Malluf
fonte
1
Então, se você é vendedor de carros, o Car seria uma raiz agregada por si só? Porque você pode ter muitos carros que não têm um cliente ainda
JorgeeFG
2
@JorgeeFG a resposta real é que ninguém tem nenhum tipo de pista. Há tantas informações conflitantes espalhadas por aí.
Mardoxx
3
Entidades filhas não são agregadas, são apenas entidades que são membros do agregado em que a raiz agregada controla. Um "agregado" é um agrupamento lógico de entidades.
Sinaesthetic
@JorgeeFG realmente depende do contexto limitado que você está projetando. Se você é um vendedor de carro, em seguida, algo como um Carshop se torna a raiz agregada, e abaixo segue-se os carros ...
Jokab
8

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 com uma Raiz Agregada.

Mais informações também podem ser encontradas aqui .

Otávio Décio
fonte
4
Obrigado. Esse é definitivamente o link quebrado mais comum e frustrante que eu sempre encontrei.
Dinah
Além disso, a redação parece invertida. Como a raiz pode estar dentro do agregado e ser pai ao mesmo tempo?
Sinaesthetic
1
A Raiz Agregada é a classe raiz. Um agregado simples está sempre contido em uma raiz agregada. Usando o diagrama colocado acima ... O cliente é a raiz agregada. O cliente pode possuir um ou mais carros. Os carros são agregados em relação ao cliente. Os carros têm um motor. O mecanismo é um agregado contido no agregado do carro. O que faz do cliente uma raiz agregada é a suposição do modelo de que o acesso a um carro ou a seus componentes é sempre através do cliente que é o proprietário do carro.
Ibrahim Malluf
8

Agregar significa coleção de algo.
root é como o nó superior da árvore, de onde podemos acessar tudo como o <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. portanto, se buscarmos qualquer usuário, ele poderá atuar como root para acessar todas as postagens relacionadas e comentários adicionais dessas postagens. Todos esses itens são considerados coletados ou agregados.

palash140
fonte
1

Agregado é onde você protege seus invariantes e força a consistência, limitando seu acesso à raiz agregada. Não se esqueça, o agregado deve projetar as regras de negócios e invariantes do seu projeto, não o relacionamento com o banco de dados. você não deve injetar nenhum repositório e nenhuma consulta não é permitida.

Alireza Rahmani Khalili
fonte