asp.net - exemple - linq to sql example



LINQ to SQL-où votre DataContext vit-il? (3)

J'utilise LINQ to SQL dans une bibliothèque d'objets d'accès aux données. La bibliothèque est utilisée dans les contextes Web (application Web / service Web) et non Web (service Windows). Initialement, j'ai stocké le DataContext sur le HttpContext courant car il me permettait de gérer une unité de travail relativement petite (une requête web) et d'éviter les objets globaux dans une application web. Évidemment, cela ne fonctionne pas dans un service Windows.

Rick Strahl a un bel article sur la gestion de la DataContext de vie de DataContext : http://www.west-wind.com/weblog/posts/246222.aspx . Malheureusement, je ne peux pas me décider sur la meilleure approche. Un DataContext global ne fonctionne pas pour les raisons qu'il mentionne, un DataContext par thread semble compliqué et potentiellement plus de problèmes que cela en vaut la peine, et une instance par objet semble difficile - vous perdez de l'élégance lorsque vous attachez le DataContext utilisé pour créer un DAO à ce DAO afin qu'il puisse update ou delete plus tard - pour ne pas mentionner, il y a quelque chose désagréablement poulet-et-oeuf au sujet de la relation.

Est-ce que quelqu'un a une expérience personnelle qui suggère qu'une approche est meilleure qu'une autre? Ou mieux encore, est-ce que quelqu'un a une quatrième ou cinquième approche que je ne vois pas? Où est le meilleur endroit pour stocker et gérer votre DataContext ?

https://src-bin.com


Answer #1

J'utilise httpcontext dans les scénarios web et le contexte des threads pour tout le reste. Nous avons construit un petit cadre pour que le contexte de données soit complètement abstrait du niveau présentation / entreprise.


Answer #2

J'utilise un contexte par thread. Il est difficile à configurer, mais il nettoie tout ce qui doit parler à la base de données.


Answer #3

Injection de dépendance.

Nous préférons garder notre couche de gestion ignorante des scénarios web et non-web. Au lieu de cela, les objets de la couche logique métier prennent une référence DataContext dans leur constructeur qui autorise (explicitement) le partage de DataContext et autorise (implicitement) le partage des objets d'entité à partir des résultats de requête car ils proviennent tous du même contexte de données.

DataContexts implémentent également IDisposable, vous devez donc gérer leur durée de vie. Tous nos formulaires Web ont une classe de base, et une partie de celle-ci est une propriété datacontext (créée paresseusement). De cette façon, tout sur une page peut le partager, ce qui est le plus souvent le cas. Le contexte est supprimé manuellement dans l'événement OnUnload () de la page.

  • Vous ne devez pas mélanger des entités linq provenant de différents contextes de données, et vous avez généralement des problèmes si vous utilisez les entités linq si le datacontext a été Dispose () 'd.




linq-to-sql