DDD - Como vocês injetam seus repositórios nas entidades de negocio ?  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
MrDataFlex
Virtual Machine Man
[Avatar]

Membro desde: 23/03/2007 18:33:34
Mensagens: 569
Offline

Usam instanciacao normal?
Usam algum container de DI ? Qual? Poderia ilustrar um exemplo de configuração dessa injeção?
Usam aspectos? Poderiam me passar um exemplo?

Estou com dúvidas nisso! Obrigado!

SCJP 5.0
Rodrigo Vieira Pinto
JavaEvangelist
[Avatar]

Membro desde: 15/07/2004 11:05:05
Mensagens: 354
Localização: São Paulo
Offline

Normalmente uso uma interface na camada de domínio.

E na camada de persistência uma classe que implementa essa interface.

E, pra que o domínio saiba qual classe que implementa aquela interface, uso DI.

"Ser o segundo é ser o primeiro dos perdedores" - Ayrton Senna

"Eu vou dá 10 pau!!" - Aracy de Almeida

Nova dupla sertaneja: Waterfall e Procedural. Pra começar, é sertanejo (ARGH!)

"Bem, dizia eu que a aritmética..." - Prof. Girafales

MrDataFlex
Virtual Machine Man
[Avatar]

Membro desde: 23/03/2007 18:33:34
Mensagens: 569
Offline

Rodrigo Vieira Pinto wrote:Normalmente uso uma interface na camada de domínio.

E na camada de persistência uma classe que implementa essa interface.

E, pra que o domínio saiba qual classe que implementa aquela interface, uso DI.


Você quer dizer que usa DI, assim:


SCJP 5.0
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

MrDataFlex wrote:Usam instanciacao normal?
Usam algum container de DI ? Qual? Poderia ilustrar um exemplo de configuração dessa injeção?
Usam aspectos? Poderiam me passar um exemplo?


Em tese todos esses métodos são iguais.
Vc precisa definir o repositorio no construtor da classe.
Se vc o passa manualmente ou com injeção é irrelevante para a construção da classe.



O que vc não deve fazer é



e esperar milagres.
Esse código espera que exista um DI e isso fazer suposição. Supor é sempre ruim.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
MrDataFlex
Virtual Machine Man
[Avatar]

Membro desde: 23/03/2007 18:33:34
Mensagens: 569
Offline

sergiotaborda wrote:
MrDataFlex wrote:Usam instanciacao normal?
Usam algum container de DI ? Qual? Poderia ilustrar um exemplo de configuração dessa injeção?
Usam aspectos? Poderiam me passar um exemplo?


Em tese todos esses métodos são iguais.
Vc precisa definir o repositorio no construtor da classe.
Se vc o passa manualmente ou com injeção é irrelevante para a construção da classe.



O que vc não deve fazer é



e esperar milagres.
Esse código espera que exista um DI e isso fazer suposição. Supor é sempre ruim.


Isso significa que há outra camada de uso acima da Person, demosntrada neste exemplo?
Como ficaria a sua utilização ?

Edit: Em outras palavras, de uma maneira de boa prática: quem estaria criando o repositório e passando a Person ?

This message was edited 2 times. Last update was at 16/04/2008 09:10:28


SCJP 5.0
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

MrDataFlex wrote:
Isso significa que há outra camada de uso acima da Person, demosntrada neste exemplo?
Como ficaria a sua utilização ?

Edit: Em outras palavras, de uma maneira de boa prática: quem estaria criando o repositório e passando a Person ?


Não existe essa outra camada.

Agora, onde vc precisa inicializar Person ? Vc faria isso no repository/dao usando create() algo como



Assim é fácil. O Repositorio auto injeta-se no person.

Na prática vc nunca pode dar um new em Person directamente. Vc precisa de um outro objeto
para fazer isso. Seja o repositorio/dao , seja um objeto especifico para isso , ou seja via DI

Se vc usar DI então o container irá prover a implementação de PersonRepository para Person quando criar o objeto person. Para isso vc precisa inicializar Person sempre através do container. Algo como (com Guice)



Claro que, assim, não precisa do método create() no repositorio/dao

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
MrDataFlex
Virtual Machine Man
[Avatar]

Membro desde: 23/03/2007 18:33:34
Mensagens: 569
Offline

sergiotaborda wrote:
MrDataFlex wrote:
Isso significa que há outra camada de uso acima da Person, demosntrada neste exemplo?
Como ficaria a sua utilização ?

Edit: Em outras palavras, de uma maneira de boa prática: quem estaria criando o repositório e passando a Person ?


Não existe essa outra camada.

Agora, onde vc precisa inicializar Person ? Vc faria isso no repository/dao usando create() algo como



Assim é fácil. O Repositorio auto injeta-se no person.

Na prática vc nunca pode dar um new em Person directamente. Vc precisa de um outro objeto
para fazer isso. Seja o repositorio/dao , seja um objeto especifico para isso , ou seja via DI

Se vc usar DI então o container irá prover a implementação de PersonRepository para Person quando criar o objeto person. Para isso vc precisa inicializar Person sempre através do container. Algo como (com Guice)



Claro que, assim, não precisa do método create() no repositorio/dao


Valeu amigão, só para finalizar, poderias validar minha arquitetura baseada em DDD, e dizer se está correta ou não?




SCJP 5.0
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

MrDataFlex wrote:
Valeu amigão, só para finalizar, poderias validar minha arquitetura baseada em DDD, e dizer se está correta ou não?


Pelo codigo que vc mosrtrou não tem nada errado. Você está usando ActiveRecord com Repositorio mutável e DAO. Eu não usaria active record, mas isso sou eu.

This message was edited 1 time. Last update was at 16/04/2008 12:01:35


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
MrDataFlex
Virtual Machine Man
[Avatar]

Membro desde: 23/03/2007 18:33:34
Mensagens: 569
Offline

sergiotaborda wrote:
MrDataFlex wrote:
Valeu amigão, só para finalizar, poderias validar minha arquitetura baseada em DDD, e dizer se está correta ou não?


Pelo codigo que vc mosrtrou não tem nada errado. Você está usando ActiveRecord com Repositorio mutável e DAO. Eu não usaria active record, mas isso sou eu.



Obrigado pelo esclarecimento, amigo!

Poderia me dizer o que faria você optar por utilizar gerenciadores ao invés de AR ?

SCJP 5.0
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Concordo com o Sergio: pelo construtor fica direto e sem magia negra.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

MrDataFlex wrote:
Poderia me dizer o que faria você optar por utilizar gerenciadores ao invés de AR ?


A pergunta seria "O que me faria usar AR". A resposta : nada.
AR não é sério para sistema grandes. Essa é a minha opinião.
Quando vc está gerenciando transações com objetos (padrão WorkUnit) o fato do objeto poder passar por cima disso tudo é muiito ruim. O objeto simplesmente não deve ter essa responsabilidade. Atrapalha.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
rodrigoy
GUJ Ranger
[Avatar]

Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline

Paulo Silveira wrote:Concordo com o Sergio: pelo construtor fica direto e sem magia negra.


Se o objeto está vindo do Contexto Persistente (EntityManager, Hibernate Session) quem injeta?

Só injeto coisas na entidade quando elas são necessárias para as responsabilidades da entidade. Salvar-se não é uma responsabilidade da entidade.

Não faz sentido algum uma entidade precisar se salvar.

Rodrigo Yoshima
www.ASPERCOM.com.br

Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro

Débito Técnico Blog: blog.aspercom.com.br
[WWW]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

Uma sugestão bem legal em minha opinião está aqui:

New Improvements in Domain Object Dependency Injection Feature

Não sou fã do @Configurable, mas as outras opções de usar uma interface marcadora ou uma annotation própria para DI me pareceu interessante.

Alguém sabe se é possível fazer algo parecido com o Guice?
[Email]
Thiago Senna
GUJ Master
[Avatar]

Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline

rodrigoy wrote:
Paulo Silveira wrote:Concordo com o Sergio: pelo construtor fica direto e sem magia negra.


Se o objeto está vindo do Contexto Persistente (EntityManager, Hibernate Session) quem injeta?


Neste caso, imagino que o ideal seria passar o repositório por parâmetro do método da entidade.



Na opinião de vocês é também uma opção válida?

This message was edited 1 time. Last update was at 17/04/2008 12:08:57

[Email]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

rodrigoy wrote:
Paulo Silveira wrote:Concordo com o Sergio: pelo construtor fica direto e sem magia negra.

Se o objeto está vindo do Contexto Persistente (EntityManager, Hibernate Session) quem injeta?


No Hibernate e JPA+Hibernate, que injeta é um interceptor configurado no hibernate.cfg.xml ou programaticamente. Fica bem legal.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team