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?

Foi útil?

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.

enter image description here

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 simplesenter image description here

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:

  1. Clientes
  2. 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.

Dinah:

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

enter image description here

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top