LINQ vs couche d'accès aux données


10

Je me suis toujours enseigné à gérer tout code d'accès aux données dans une «couche» complètement distincte de ma logique métier et de mon code d'interface utilisateur. Cela a toujours été une très bonne architecture pour moi et toutes les «règles» ou meilleures pratiques que je vois parviennent toujours à s'intégrer dans ce style de codage, en particulier le principe de responsabilité unique .

Pour la plupart de mes projets à la maison, j'utiliserais mon propre ORM que j'ai créé, que j'ai toujours eu l'intention de rendre open-source. Cependant, depuis lors, LINQ est devenu disponible, ce qui était très similaire à la façon dont mon ORM fonctionnait (mais ... mieux).

Il n'y a rien que je pouvais faire auparavant avec mon propre ORM que je ne peux pas faire maintenant avec LINQ (sauf des bits de l'intégration REST). Donc ma question est; LINQ est-il ma nouvelle couche d'accès aux données? Ai-je encore besoin de cette couche? Mon BLL doit-il simplement parler directement à LINQ? Ou est-ce toujours une mauvaise pratique?

Éditer:

La question d'origine faisait référence à LINQ to Entities, mais il existe de nombreuses réponses intéressantes concernant LINQ to SQL. Que pensent les gens des deux? Je suppose que LINQ to SQL ne peut pas vraiment remplacer un DAL, mais l'entité Framework pourrait-elle?

Réponses:


7

Bien que vous puissiez simplement placer des requêtes LINQ dans votre BLL, cela peut entraîner une duplication de code. Je créerais toujours des référentiels qui seront un wrapper pour les requêtes LINQ. Cela séparera le code de la base de données du code BLL et sera utile lorsque vous décidez de modifier votre code d'accès aux données (par exemple, passer à Dapper ou à des requêtes précompilées).

Cela facilitera également les tests unitaires , car les référentiels peuvent être facilement moqués.


6

Vous pouvez toujours avoir un DAL, mais il peut utiliser LINQ to SQL au lieu de ce que vous aviez utilisé précédemment. C'est comme ça que je le fais de toute façon. Ne faites pas votre BLL utiliser directement LINQ to SQL pour accéder aux données.


Je suis d'accord, LINQ to SQL n'est qu'un langage de requête qui peut vous empêcher d'écrire beaucoup de code de plomberie. Il n'encapsule pas l'accès aux données dans votre application comme le devrait un DAL.
neontapir

Je parlais vraiment de LINQ to Entities. J'utilise également beaucoup de LINQ to Objects mais je considère que c'est une logique métier. Je comprends la différence en arrière-plan entre les entités et LINQ to SQL, mais je n'ai jamais utilisé LINQ to SQL. Y a-t-il des différences de syntaxe?
Connell

2

Linq ne concerne pas l'accès aux données, vous pouvez utiliser linq vers n'importe lequel IEnumerable.

Avez-vous essayé de concevoir votre application sans penser à la base de données au départ? Autrement dit, implémentez votre application et utilisez une sorte de référentiel. Ensuite, vous utilisez n'importe quelle technique pour implémenter ces référentiels. De cette façon, vous avez une solution totalement découplée où vous pouvez brancher la couche d'accès aux données que vous souhaitez.

Dans cette couche d'accès aux données, vous pouvez utiliser votre propre ORM ou vous pouvez utiliser Linq pour sql, cela n'a pas d'importance tant que la couche d'accès aux données implémente les référentiels que vous avez définis.


1

À moins que vous ne vouliez que votre "couche de logique métier" traite les transactions et les performances des requêtes, il existe toujours un besoin d'un DAL.

LINQ fait de la déclaration de requête un processus de conception (aka, vérifié par le compilateur).

Les fournisseurs de requêtes LINQ (tels que LinqToSql et LinqToEntities) effectuent toujours la conversion au moment de l'exécution de ces requêtes déclarées en texte sql. Ensuite, le SGBD effectue toujours l'interprétation des requêtes au moment de l'exécution, la génération du plan de requête au moment de l'exécution, etc.

Ce ne sont qu'une petite partie du DAL.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.