Duvida com Repositorio acessando diferentes TIERS

Boa noite senhores,

Estou fazendo o design de uma aplicação, estou tendendo ao DDD. Esta aplicação, possui uma classe de dominio, meramente ilustrativa “Empresa”, supomos também que esta classe Empresa possui três campos:

funcionarios
clientes
acionistas

Digamos que, cada um destes campos é provido por uma TIER diferente, exemplo:

funcionarios = webservice
clientes = Banco de dados
acionistas = arquivo

Então, tenho minha interface EmpresaRepository:

listFuncionariosById.. listClientesByExample.. listAcionistasByNameOrderByAmont..

Logo, minha classe Empresa, receberia uma instancia de uma implementacao de repositorio pelo construtor, e teria seus getters invocando estes métodos… (lazy strategy)

[color=red]dúvida:

É errado eu implementar esta interface “usando” uma classe só? Por exemplo, um método faria chamada a um webservice enquanto outro a um banco de dados… isso me parece um tanto estranho (não muiito coeso a nivel de implementacao), existe uma maneira mais elegante?
[/color]

Pelo que parece que seus campos são mais do que atributos, são dominios!

Acho mais interessante cada dominio cuidar de seus próprios afazeres, até porque no final podem existir outras funcionalidades e você estaria criando uma classe única para gerenciar todo o processamento.

Agora falando sobre padrões, quando possuimos diversas fontes, seria interessante usar algo como session facade para acessar as tiers.

[quote=MrDataFlex]Boa noite senhores,

Estou fazendo o design de uma aplicação, estou tendendo ao DDD. Esta aplicação, possui uma classe de dominio, meramente ilustrativa “Empresa”, supomos também que esta classe Empresa possui três campos:

funcionarios
clientes
acionistas

Digamos que, cada um destes campos é provido por uma TIER diferente, exemplo:

funcionarios = webservice
clientes = Banco de dados
acionistas = arquivo

Então, tenho minha interface EmpresaRepository:

listFuncionariosById.. listClientesByExample.. listAcionistasByNameOrderByAmont..

Logo, minha classe Empresa, receberia uma instancia de uma implementacao de repositorio pelo construtor, e teria seus getters invocando estes métodos… (lazy strategy)

[color=red]dúvida:

É errado eu implementar esta interface “usando” uma classe só? Por exemplo, um método faria chamada a um webservice enquanto outro a um banco de dados… isso me parece um tanto estranho (não muiito coeso a nivel de implementacao), existe uma maneira mais elegante?
[/color]

[/quote]

Não use cores dessa forma.
O seu pensamento está correto. O repositorio irá comunicar com 3 diferentes serviços de aplicação para responder aqueles métodos.
Repositorio não é uma interface. Vc cria um objeto EmpresaRepositorio. Apenas um. Esse objeto recebe implementações de três serviços
que mediam essas três formas de comunicação/dados DO ponto de vista do objeto repositorio ele não sabe onde os dados estão.

A unica coisa errada na sua estrutura é colocar o repositorio sendo usado pela entidade empresa. Não faça isso.

[quote=sergiotaborda][quote=MrDataFlex]Boa noite senhores,

Estou fazendo o design de uma aplicação, estou tendendo ao DDD. Esta aplicação, possui uma classe de dominio, meramente ilustrativa “Empresa”, supomos também que esta classe Empresa possui três campos:

funcionarios
clientes
acionistas

Digamos que, cada um destes campos é provido por uma TIER diferente, exemplo:

funcionarios = webservice
clientes = Banco de dados
acionistas = arquivo

Então, tenho minha interface EmpresaRepository:

listFuncionariosById.. listClientesByExample.. listAcionistasByNameOrderByAmont..

Logo, minha classe Empresa, receberia uma instancia de uma implementacao de repositorio pelo construtor, e teria seus getters invocando estes métodos… (lazy strategy)

[color=red]dúvida:

É errado eu implementar esta interface “usando” uma classe só? Por exemplo, um método faria chamada a um webservice enquanto outro a um banco de dados… isso me parece um tanto estranho (não muiito coeso a nivel de implementacao), existe uma maneira mais elegante?
[/color]

[/quote]

Não use cores dessa forma.
O seu pensamento está correto. O repositorio irá comunicar com 3 diferentes serviços de aplicação para responder aqueles métodos.
Repositorio não é uma interface. Vc cria um objeto EmpresaRepositorio. Apenas um. Esse objeto recebe implementações de três serviços
que mediam essas três formas de comunicação/dados DO ponto de vista do objeto repositorio ele não sabe onde os dados estão.

A unica coisa errada na sua estrutura é colocar o repositorio sendo usado pela entidade empresa. Não faça isso.
[/quote]

Sergio, obrigado pela resposta. Deixe-me entender. Pq não programo voltado a interface neste caso? E se eu não colocar a responsabilidade de invocar dentro do objeto empresa, terei que fazer algo como:

x = new Empresa().. x.setFuncionario(repositorio.getFuncionarios()) ...

para todos os atributos… sendo que eu poderia controlar isso por demanda dentro do objeto… tem um approach melhor?

Teria como representar em draft code a sua idéia ?

Valeu!