2009-11-20 6 views
1

J'ai ce code.Comment faire le nettoyage?

Une classe de base qui crée une nouvelle instance du contexte.

public class Base 
{ 
     private Entities context; 

     public Base() 
     { 
      context = new Entities(); 
     } 
} 

Et que les classes qui héritent de cette classe.

public class SomeService : Base 
{ 

     public Gallery Get(int id) 
     { 
      return context.GallerySet.FirstOrDefault(g => g.id == id); 
     } 
} 

La question est, comment prendre soin de disposer de l'objet de contexte? Je pensais à un destructeur dans les classes de base, où j'appellerais simplement la méthode de disposition de l'objet de contexte.

~Base() 
{ 
    context.Dispose(); 
} 

Cela serait-il suffisant? Ou existe-t-il un autre moyen de prendre soin de l'objet contextuel?

Répondre

6

Votre classe de base doit implémenter IDisposable plutôt que d'avoir un finaliseur. Vous ne devez disposer d'un finaliseur que lorsque vous disposez d'un accès direct à des ressources non gérées (par exemple, un IntPtr représentant un handle Windows).

Cependant, je voudrais essayer pour élaborer un design qui n'a pas impliqué cela. Dans la mesure du possible, j'essaie d'éviter d'avoir des variables membres à éliminer - j'ai tendance à acquérir des ressources à l'intérieur des méthodes, à les transmettre à d'autres méthodes, puis à les éliminer dans la même méthode. Moins vous avez d'implémentations de IDisposable, moins vous aurez de ressources à gérer. Évidemment, c'est parfois inévitable ...

+0

Il est logique que vous avez dit au sujet IDisposable.But l'approche ci-dessus, je voulais me débarrasser d'appeler à l'aide dans chaque méthode comme celui-ci à l'aide (entités contexte = nouvelles entités()) { .... } La classe SomeService aura beaucoup de méthodes courtes utilisant l'objet context. Et la répétition de l'approche utilisant dans chaque méthode est contre le principe SOLID. – user137348

+0

Vous aurez toujours besoin d'utiliser des instructions quelque part. Vous n'avez pas besoin de l'instruction using dans chaque méthode SomeService - le contexte pourrait être passé dans la méthode, par exemple. –

+0

D'accord avec @Jon. Jetez un oeil à [cet article] [1]. Notez que le titre est Mise en œuvre Finalize and Dispose pour nettoyer ** Ressources non gérées **, même si l'article est classé sous Common Design Patterns (modèle jetable) [1]: http://msdn.microsoft.com/ en-us/library/b1yfkh5e% 28VS.71% 29.aspx –

1

Avoir le destructeur tel que vous l'avez écrit serait réellement faux, car le framework ne garantit pas que l'objet de contexte sera valide au moment de la finalisation.

Vous devez implémenter IDisposable sur votre objet et y disposer le contexte. Si le contexte a des ressources non gérées, il devrait avoir son propre finaliseur.