Estamos usando o padrão de repositório certo?

14

Estamos usando um monte de classes separadas com o sufixo -repositorypara recuperar os dados do banco de dados; para cada tabela seu próprio repositório.

Temos, por exemplo, uma customerrepositoryclasse que possui todos os tipos de métodos para recuperar clientes e uma vacancyrepositoryque possui todos os tipos de métodos para recuperar vagas.

Eu tenho duas perguntas sobre essa maneira de fazer as coisas:

  1. Que tal obter dados que abrangem várias tabelas? Por exemplo, tenho uma tela que mostra todos os clientes que ainda não criaram uma vaga. É possível customerrepositoryusar métodos do vacancyrespository, ou ambos os repositórios retornam resultados e existe uma classe mais alta na hierarquia (vamos chamá-la de dataservice) que obtém os resultados dos dois repositórios e os combina em um resultado?

  2. quanta lógica um repositório pode suportar?
    Acho que não há problema em implementar o 'where active == true' em um repositório para recuperar apenas registros ativos, ou mesmo essa lógica simples deve ser tratada por uma classe mais alta na hierarquia (vamos chamá-lo de dataservice)?

O exemplo que eu estava encontrando agora é este:

Temos uma lista de perguntas, que contém uma ou mais perguntas.
A pergunta pode ter um resultado, que é mantido em uma tabela separada.
Portanto, quando você deseja recuperar o resultado total da lista de perguntas, é necessário combinar dados da questionlisttabela, da tabela de perguntas e da questionstatustabela.

No momento, temos 3 repositórios diferentes para essas tabelas.

Se eu perguntasse questionlistrepositoryqual é o resultado total da lista número 12, ele teria que obter dados de dois outros repositórios e, portanto, ter alguma lógica, isso é permitido?

Ou existe questionlistdataservicealguém que sabe quais repositórios usar?

Mais uma coisa: nossos repositórios podem resultar em um IQueryableserviço de chamada que pode combinar facilmente os resultados, mas e se esse não for o caso, não acho que seja uma boa ideia recuperar todo o conteúdo de todas as três tabelas do base de dados.

Michel
fonte
1
Normalmente, em vários acessos à tabela, a tabela dominante é determinada pela tabela do registro que deve existir antes que a consulta a busque. Em LEFT OUTER JOIN, essa seria a primeira tabela mencionada e em RIGHT OUTER JOIN, seria a segunda.
Neil

Respostas:

15

O repositório retorna objetos de domínio e é construído sobre as camadas de mapeamento. Para um domínio de domínio muito simples, os objetos e as tabelas de banco de dados podem ser praticamente os mesmos.

Se o seu repositório está sempre retornando uma representação exata da sua estrutura de dados, pode ser o Table Data Gateway, também conhecido como Data Access Object (DAO).

Exemplo: Seu banco de dados possui tabelas para pessoa e endereço. No endereço de domínio do aplicativo, não é uma entidade própria, é apenas uma propriedade de Person. Nesse caso, você não teria PersonRepository e AddressRepository. Você apenas tem PersonRepository. O domínio não deve se preocupar com a forma como os dados do domínio são mantidos. Essas responsabilidades estão em uma camada atrás do repositório.

Pelo seu exemplo, parece que você realmente tem DAOs e acabou de nomeá-los Repositórios.

simoraman
fonte
Portanto, ao criar um repositório, também posso ter um gateway de dados de tabela um nível mais profundo, e nossos repositórios são na verdade TDGs.
Michel
1
Você poderia, mas pesar o custo e os benefícios. Não se intimide em manter DAOs e Repositórios separados pelo princípio de "camadas" de código. Faça o que for mais legível neste caso. A separação e a camada de abstração resultante podem ser úteis se seus Repositórios tenderem a recompor muito os dados nos DAOs.
Mihai Danila