LINQ to SQL - d'où vient votre DataContext de vivre?
Je suis en utilisant LINQ to SQL dans un objet d'accès aux données de la bibliothèque. La bibliothèque est utilisée à la fois sur internet (application web/web service) et non web (service windows) contextes. D'abord, j'ai stocké le DataContext
sur l'actuel HttpContext
car il m'a permis de gérer la taille relativement petite de l'unité de travail (une requête web) et d'éviter des 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
's durée de vie: http://www.west-wind.com/weblog/posts/246222.aspx. Malheureusement, je ne peux pas me décider sur la meilleure approche. Mondial DataContext
ne fonctionne pas pour les raisons qu'il mentionne, par Thread DataContext
semble complexe et potentiellement plus d'ennuis que cela vaut la peine, et par l'instance de l'objet semble pointilleux - vous perdez une certaine élégance lorsque vous attachez le DataContext
utilisé pour créer un DAO
pour que DAO
de sorte qu'il peut update
ou delete
plus tard - pour ne pas mentionner, il ya quelque chose de désagréablement poulet-et-eggish au sujet de la relation.
Quelqu'un aurait-il une expérience personnelle que suggère une approche est meilleure que l'autre? Ou mieux encore, quelqu'un aurait-il une quatrième ou de la cinquième approche, je ne vois pas? Où est le meilleur endroit pour stocker et gérer vos DataContext
?
Vous devez vous connecter pour publier un commentaire.
Les lignes directrices de la La documentation MSDN sur le DataContext de la classe sont ce que je recommanderais suivantes:
Parce que
DataContext
estIDisposable
, je trouve qu'il est plus facile de créer et d'utiliser unDataContext
dans unusing
déclaration dans un délai d'une méthode, de sorte qu'il peut être éliminés de façon appropriée.Notez également que "tous les membres de l'instance ne sont pas garantis pour être thread-safe", de sorte que le partage d'une
DataContext
entre plusieurs threads serait imprudent.L'Injection De Dépendance.
Nous préférons garder nos affaires couche ignorants de web vs non-web d'un scénario. Au lieu de cela, la couche logique métier d'objets prendre un DataContext de référence dans leur constructeur qui (de manière explicite) permet de partager le DataContext et (implicitement) permet le partage de l'entité des objets à partir de résultats de la requête comme ils sont tous issus du même contexte de données.
Aussi DataContexts mettre en œuvre IDisposable, si vous avez vraiment besoin pour gérer leur vie. Tous nos formulaires web ont une classe de base, et une partie de qui est une propriété datacontext (paresseusement créé). De cette façon, tout sur une page peut partager, ce qui est le plus souvent le cas. Le contexte est éliminé manuellement dans la page de OnUnload() de l'événement.
Je suis en utilisant par thread contexte. Il est difficile à installer, mais il nettoie tout ce qui a besoin de parler à la db.
Je suis en utilisant httpcontext dans les scénarios de web et contexte de thread pour tout le reste. Nous avons construit un petit cadre, de sorte que le contexte de données serait complètement abstraction de la présentation/niveau entreprise.