Le référentiel Linq to SQL doit-il implémenter IDisposable?

Au cours des derniers jours, j’ai consulté Google sur les modèles de référentiel. Il y a beaucoup d’informations disponibles, mais elles sont souvent contradictoires et je cherche toujours une source définitive.

Je ne sais toujours pas si le référentiel doit instancier son propre DataContext et avoir une méthode SubmitChanges, ou si DataContext doit être injecté et la soumission traitée en externe. J’ai vu les deux dessins mais pas de vrai commentaire sur le raisonnement.

Quoi qu’il en soit, le modèle suivant est assez commun

class Repository { DataContext db = new LinqDataContext(); public IEnumerable GetAll() { ... } public T GetById() { ... } ... etc public void SubmitChanges() { ... } } 

Ma question principale est donc, avec l’implémentation ci-dessus, pourquoi le référentiel n’a pas besoin d’implémenter IDisposable? J’ai vu littéralement des centaines d’exemples comme ci-dessus, et aucun d’entre eux ne semble vouloir se préoccuper de disposer du DataContext. N’est-ce pas une fuite de mémoire?

La suppression d’un DataContext ferme la connexion sous-jacente si l’autoclose est défini sur false. Si vous n’appelez pas disposer, vous devez attendre que le GC l’appelle pour vous. Vous devez implémenter IDisposable et disposer de vos référentiels, qui à leur tour devraient disposer de leur DataContext.

Une autre solution consiste à créer un nouveau contexte de données pour chaque méthode dans votre référentiel si vos méthodes ne fonctionnent pas ensemble dans une seule transaction. Ensuite, vous pouvez disposer de vos contextes dès qu’ils sont utilisés via une directive using ().

Pas nécessaire, mais vous devriez probablement implémenter IDisposable .