LINQ vs camada de acesso a dados

10

Eu me ensinei sempre a lidar com qualquer código de acesso a dados em uma 'camada' completamente separada da minha lógica de negócios e código da interface do usuário. Essa sempre foi uma arquitetura muito boa para mim e quaisquer 'regras' ou práticas recomendadas que eu vejo ainda conseguem se encaixar nesse estilo de codificação, especialmente o Princípio de Responsabilidade Única .

Para a maioria dos meus projetos domésticos, eu usava meu próprio ORM que criei, que sempre pretendi criar código-fonte aberto. No entanto, desde então, o LINQ tornou-se disponível, o que era muito semelhante ao modo como meu ORM funcionava (mas ... melhor).

Não há nada que eu pudesse fazer anteriormente com meu próprio ORM que agora não posso fazer com LINQ (exceto bits da integração REST). Então minha pergunta é; LINQ é minha nova camada de acesso a dados? Preciso mais dessa camada? Minha BLL deveria apenas falar diretamente com o LINQ? Ou essa prática ainda é ruim?

Editar:

A pergunta original se referia ao LINQ to Entities, mas há muitas respostas interessantes sobre o LINQ to SQL. Quais são os pensamentos das pessoas sobre os dois? Eu entendo que o LINQ to SQL não pode realmente substituir um DAL, mas o Entity Framework poderia?

Connell
fonte

Respostas:

7

Embora você possa colocar consultas LINQ em sua BLL, isso pode levar à duplicação de código. Eu ainda criaria repositórios que serão um invólucro para consultas LINQ. Isso separará o código do banco de dados do código BLL e será útil quando você decidir modificar seu código de acesso a dados (por exemplo, vá para Dapper ou para consultas pré-compiladas).

Também ajudará no teste de unidade , pois os repositórios podem ser facilmente zombados.

Jakub Konecki
fonte
6

Você ainda pode ter um DAL, apenas ele poderia usar o LINQ to SQL em vez do que você havia usado anteriormente. É assim que eu faço de qualquer maneira. Não faça seu BLL usar diretamente o LINQ to SQL para acessar dados.

neeKo
fonte
Concordo que o LINQ to SQL é apenas uma linguagem de consulta que pode impedir que você escreva muito código de canalização. Ele não encapsula o acesso a dados em seu aplicativo como um DAL deveria.
Ne11 #
Eu estava me referindo ao LINQ to Entities realmente. Eu também uso bastante LINQ to Objects, mas considero que isso é lógica de negócios. Entendo a diferença dos bastidores entre Entidades e LINQ to SQL, mas nunca usei o LINQ to SQL. Existem diferenças na sintaxe?
Connell
2

Linq não é sobre acesso a dados, você pode usar o linq para qualquer um IEnumerable.

Você tentou projetar seu aplicativo sem pensar no banco de dados primeiro? Ou seja, implemente seu aplicativo e use algum tipo de repositório. Então você usa qualquer técnica para implementar esses repositórios. Dessa forma, você tem uma solução totalmente dissociada, na qual é possível conectar qualquer camada de acesso a dados que desejar.

Nessa camada de acesso a dados, você pode usar seu próprio ORM ou o Linq para sql, não importa, desde que a camada de acesso a dados implemente os repositórios que você definiu.

Tomas Jansson
fonte
1

A menos que você queira que sua "camada lógica de negócios" aborde transações e desempenho de consultas, ainda é necessário um DAL.

O LINQ torna a declaração de consulta um processo em tempo de design (também conhecido como compilador verificado).

Os provedores de consulta LINQ (como LinqToSql e LinqToEntities) ainda fazem conversão em tempo de execução dessas consultas declaradas em texto sql. Em seguida, o DBMS ainda faz a interpretação da consulta em tempo de execução, a geração do plano de consulta em tempo de execução etc.

Estes são apenas uma pequena parte do DAL.

Amy B
fonte