Olá tenho algumas dúvidas conceituais em relação a AGGREGATES e AGGREGATES ROOT.
Posso considerar uma AGGREGATE como a junção de uma ENTITY com um VALUE OBJECT, exemplo tenho o ex abaixo:
A ENTITY Cliente.
class Cliente
private int id;
private String nome;
Um Value object Endereco
class Endereco
private String rua;
private String bairro;
private String cep;
A classe abaixo seria uma AGGREGATE
class Cliente
private Endereco endereco;
Agora onde entra o AGGREGATE ROOT?
Obrigado!
Não, porque isto implicaria que todo AGGREGATE teria que possuir Value Objects, mas a existência ou não de Value Objects não é o que define o padrão AGGREGATE.
ps: Se considerarmos tipo Integer ou String como Value Objects e que todo AGGREGATE possui pelo menos uma ENTITY (o AGGREGATE ROOT) então talvez poderíamos concluir que todo AGGREGATE possui Value Objects no final, mas ainda assim sua definição de AGGREGATE é falha IMO.
ps: E na opinião do Eric Evans também.
Essa pergunta eu achei particularmente curiosa porque na minha concepção o AGGREGATE cresce a partir do ROOT, e não o contrário.
Olá , então realmente estou confuso nestes conceitos; Poderia dar um exemplo de um AGGREGATE ROOT e um AGGREGATE dentro de um sistema real?
Obrigado!
[quote=ravisantos]Olá , então realmente estou confuso nestes conceitos; Poderia dar um exemplo de um AGGREGATE ROOT e um AGGREGATE dentro de um sistema real?
Obrigado![/quote]
Não estou com muita imaginação no momento pra inventar um sistema “real”, mas vejo um aggregate se formando quando identifico uma entidade no domínio e um correspondente repositório que será utilizado para persistir a entidade. Na medida que novas responsabilidades são atribuídas à entidade ela vai “inchando” e então desmembrada em outros objetos, sendo que alguns desses objetos ainda mantém uma relação de consistência de dados com a entidade ROOT que precisa ser preservada. Este é o caso que precisa pertencer ao agregado. Uma entidade (inclusive o ROOT) pode conter tanto value objects como outras entidades, value objects não podem conter entidades. Todos esses objetos são alterados sempre por meio do repositório do ROOT que fica responsável de garantir a consistência das alterações.
Fui claro?