Pergunta

Eu estou trabalhando em um projeto usando ASP.NET MVC, e modelo de repositório. Tenho aulas de repositório e serviços que consomem essas classes de repositório. A minha pergunta é: É correto retornar um IQueryable da minha aula de repositório e, em seguida, usar ".Where" e ".OrderBy" em um serviço para gerar uma lista? Se sim, é a melhor prática?

Obrigado!

Foi útil?

Solução

Para começar: não há "certo" ou "errado" aqui. É apenas uma questão do que funciona melhor para você e para o sistema que você está construindo. Por exemplo, Rob Conery fez um exemplo de aplicativo ASP.NET chamado Storefront com exatamente o padrão que você está descrevendo e acendeu uma guerra grande. Uma grande parte da discussão evoluiu em torno do padrão Repository que é considerado o "original" como descrito por Eric Evans em seu livro Domain Driven projeto e que descreve a interface de um repositório como um que aceita e / ou retorna instâncias reais (de listas de instâncias) e não uma interface de consulta.

Tanto para a teoria. O que escolher para o seu sistema? A razão que eu não iria escolher diretamente a rota IQueryable é que ele realmente vaza um pouco da minha estratégia de persistência para a camada de cliente (sendo a camada de serviço, neste caso). Desde que basicamente faz sentido para retornar um IQueryable se você recuperar objetos do banco de dados usando o LINQ para [um método de acesso de banco de dados (como SQL, Entidades, ...)]. Só então .Where ou .OrderBy ser otimizar o seu resultado da consulta. É, obviamente, não faz sentido se você estiver usando algum código de código de acesso de banco de dados que obtém uma lista completa, que você, em seguida, expor a partir do repositório usando LINQ to Objects. Então, em suma:. Você faz amarrar sua camada do cliente na estratégia de acesso ao banco de dados baseado LINQ você estiver usando

Sendo um pouco de um purista mim, eu preferiria não a vir à tona este laço para LINQ de fora do meu repositório, e eu iria escolher para oferta onde- e fim-de critérios, mediante os parâmetros das operações do repositório. Eu posso fazer toda a otimização de recuperação no repositório e retornar um conjunto limpo limpo de objetos de domínio.

Assim, no final tudo se resume a:. O que funciona melhor para você é bom

Outras dicas

Eu não vejo por que seria um problema. Se você estiver indo para se tornar mais específico nos dados que serão recuperando em sua camada de serviço, o que significa menos dados sendo transferidos entre o aplicativo eo banco de dados - o que significa maior eficiência. Fazer isso significa que você vai ser também implementar o carregamento lento, ou obter os dados quando você absolutamente precisa. Considerando a apatridia da web, isso é uma coisa boa. Você não quer ser a recuperação de todos os dados no caso de você pode usá-lo.

Em outras palavras, não há nenhum sentido em obter a lista completa de usuários, simplesmente selecione aquele cujo nome é "Jackolantern."

A melhor maneira de pensar sobre isso é como assim? - se você decidir mudar de MSSQL para MySQL amanhã, você terá a lógica de negócios replicar Se sim, então você está utilizando o seu repositório incorretamente.

Sim, eu estou muito feliz com o repositório de retornar IQueryable, mas com uma ressalva: algumas funções Linq não estão disponíveis em todos os provedores. Por exemplo, os métodos standard / SingleOrDefault não estão disponíveis em Linq para entidades. Portanto, sua camada de serviço pode ter que saltar através de algumas aros, dependendo de qual implementação concreta do seu repositório é usado.

Eu costumo colocar a interface das classes de repositório na camada de domínio e as implementações reais na camada de serviço.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top