é uma prática ruim que o controlador chame o repositório em vez do serviço?
para explicar mais:
Descobri que, em um bom design, os controladores chamam serviço e serviço usam repositório.
mas às vezes no controlador eu não tenho / preciso de nenhuma lógica e só preciso buscar no db e passá-lo para visualização.
e posso fazer isso apenas chamando o repositório - não é necessário chamar o serviço - é uma prática ruim?
design-patterns
object-oriented
mvc
repository
mohsenJsh
fonte
fonte
Respostas:
Não, pense assim: um repositório é um serviço (também).
Se as entidades que você recuperar através do repositório manipularem a maior parte da lógica de negócios, não haverá necessidade de outros serviços. Apenas ter o repositório é suficiente.
Mesmo se você tiver alguns serviços pelos quais você deve passar para manipular suas entidades. Pegue a entidade do repositório primeiro e depois passe para o referido serviço. Ser capaz de lançar um HTTP 404 antes mesmo de tentar é muito conveniente.
Também para o cenário de leitura é comum, você só precisa da entidade para projetá-lo em um DTO / ViewModel. Ter uma camada de serviço no meio do caminho geralmente resulta em muitos métodos de passagem, o que é bastante feio.
fonte
Não é uma prática recomendada para um controlador chamar um repositório diretamente. Um "serviço" é apenas outra ferramenta, portanto, use-o onde fizer sentido.
NikolaiDante comentou:
Não acho que a consistência seja o aspecto mais importante. Uma classe "service" deve encapsular alguma lógica de nível superior, para que o controlador não precise implementá-la. Se não houver uma "lógica de nível superior" necessária para uma determinada operação, basta ir diretamente ao repositório.
Para promover boas Separações de Preocupações e testabilidade, o repositório deve ser uma dependência que você injeta no serviço por meio de um construtor:
Se a procura de registros no banco de dados precisar de algum tipo de consulta parametrizada, uma classe de serviço pode ser um bom lugar para levar em seu modelo de exibição e criar uma consulta que será executada pelo repositório.
Da mesma forma, se você tiver um modelo de exibição complexo para um formulário, uma classe de serviço poderá encapsular a lógica de criação, atualização e exclusão de registros chamando métodos em seus Modelos / Entidades de Domínio e persistindo-os usando um repositório.
Indo na direção oposta, se o seu controlador precisar obter um registro por seu ID, delegar a um objeto de serviço é como acertar uma tachinha com uma marreta - é muito mais do que você precisa.
Eu descobri que o controlador está na melhor posição para lidar com a transação, ou um objeto Unit Of Work . O controlador ou o objeto Unit Of Work, em seguida, delegaria objetos de serviço para operações complexas ou iria diretamente ao repositório para operações simples (como encontrar um registro por ID).
Eu acho que uma combinação de serviços e trabalhar diretamente com repositórios é perfeitamente aceitável. Você pode encapsular ainda mais a transação em um objeto de Unidade de trabalho, se achar necessário.
A repartição de responsabilidades é assim:
fonte
DbContext
é um nome ruim nesse caso. Eu vou mudar isso. Eu uso o NHibernate e os repositórios (ou o contexto, se for útil) gerenciam o final do banco de dados; portanto, a alteração dos mecanismos de persistência não requer alterações de código fora do contexto.Depende da sua arquitetura. Eu uso o Spring e a transacionalidade é sempre gerenciada pelos serviços.
Se você chamar repositórios diretamente para operações de gravação (ou serviços simples sem lógica que simplesmente delegam ao repositório), provavelmente você está usando várias transações de banco de dados para uma operação que deve ser executada em uma. Isso levará a dados incoerentes no seu banco de dados. Como regra geral, as operações do banco de dados devem funcionar, ou devem falhar, mas as operações de meio trabalho são a causa de dores de cabeça.
Por esse motivo, acho que chamar repositórios diretamente de controladores ou usar serviços simples de delegação é uma prática ruim. Você começa a fazer isso apenas para leitura e muito em breve você ou um de seus colegas começará a fazer isso para operações de gravação.
fonte