Agregados (DDD)
Tags: ddd
Published: 2021-02-01 12:18:51


>###Definição
  * É maneira de reduzir a complexidade técnica.
  * É um cluster de objetos de domínio que podem ser tratados como uma única unidade.
  * Não existe uma classe implementando um agregado.
  * Representa um conceito do domínio e não um container de itens.
  * Definir agregados é reversível e uma atividade continua.
  

###Definir Agregados

   * #####Limites Transacionais

     - Definir a transações conforme a força dependência

   * #####Dependências

     - Definir tipos de relacionamentos (UML) e Força de 
dependência 
	 
   * #####Coleções

     - Quantidade de agregados equivale a numero de coleções em banco de dados NoSql  

   * #####Pensando em Definições Técnicas

     - Definir um agregado é um processo continuo influenciado pelo feedback da sua implementação. "Persistência", "Consistência" e "Concorrência" são detalhes de implementação que podem ser
difícil de acertar e pode fazer com que você repense seus limites de agregados.

###Raiz do Agregado

   * ####Ponto de Entrada (Classe) para acesso ao agregado. 
     
     - Fornece o nome conceitual do agregado.

   * ####Coordena todas as mudanças do agregado
     - Assegura que todos os clientes não definam o agregado para um estado inconsistente.
 
###Performance

   * Agregados grandes pode degradar a performance.
     
     - Devido a quantidade de informações a serem carregadas e salvas.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4qpnnlzl3xmxwme43n9d.png)

###Definição de Entidade

  * Surge "Substantivos" surgem as "Entidades"
  * Podem mudar ao longo do tempo (Utiliza ID)

###Informações
	  
   * Propriedade de navegação
     -  O Id é uma propriedade para acessar informação

###Recomendações

####Refatorar Sempre

`Definir agregados é uma atividade continua, não coloque sobre você a pressão para criar um definição de agregados perfeita na tentativa inicial. Quanto mais melhorias mais você saberá sobre o Domínio.`

####Transação

`Se você precisa alterar mais de um agregado em uma transação, é um sinal que os limites do seu agregado possa ser melhor alinhado com o problema do domínio.`

####Interfaces com o Usuário

`Agregados não devem ser planejados com base nas Interfaces com o Usuário (UIs).`

####Banco de Dados

`Os associações do modelo de dados não pode influenciar as associações entre os objetos do domínio. Os objetos não são os mesmos como as tabelas do banco de dados. Modelos de dados representam um relacionamento de "Composição" para suportar integridade referencial e construir relatórios para BI (Business Intelligence).`

####Fatores Técnicos

`Fatores técnicos afetam seus agregados principalmente "Performance" e "Escabilidade".` 
* `Se você está salvando ou carregando agregados acima das definições de performance pode representar que seu agregado está muito grande.`

###Referencias

[Livro Patterns-Principles-Practices-Domain-Driven-Design](https://www.amazon.com.br/Patterns-Principles-Practices-Domain-Driven-Design/dp/1118714709)

[Agregados | DDD do jeito certo | Parte 06](https://www.youtube.com/watch?v=1AEOcQWQR2o)

[DDD_Aggregate | Martin Fowler
](https://martinfowler.com/bliki/DDD_Aggregate.html)

[Domain model purity and lazy loading](https://enterprisecraftsmanship.com/posts/domain-model-purity-lazy-loading/#:~:text=Lazy%20loading%20allows%20you%20to,%2C%20encapsulation%2C%20and%20simplicity).)