2010-06-02 18 views
1

Ma classe est héritée de UnityContainer (Unity 2.0), voici le code source:récursivité dans l'unité et Evacuer la mise en œuvre de modèle

public class UnityManager : UnityContainer 
    { 

     private UnityManager() 
     { 
      _context = new MyDataClassesDataContext(); 
      // ... 
     } 


     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       _context.Dispose(); 
      } 

      base.Dispose(disposing); 
     } 

     private readonly CMCoreDataClassesDataContext _context; 
    } 

Lorsque la méthode Dispose est appelé à l'instance de la classe UnityManager tomber dans récursivité. .. Pourquoi? Pour autant que je sache, base.Dispose doit appeler la méthode Dispose de la classe de base seulement ... n'est-ce pas? Qui rappelle le Dispose (bool) de UnityManager? Comment éviter cela?

Merci.

Répondre

1

Grâce à Nicole, j'ai trouvé une raison ... merci. Mais comment disposer le conteneur dans ce cas? En cas d'appel 'Dispose' par exemple de UnityManager, la fonction base.Dispose (true) appelle à nouveau Dispose .... et à nouveau (la récursivité va commencer).

Pour contourner ce problème, j'ai ajouté bool variable privée supplémentaire _bDisposed:

protected override void Dispose(bool disposing) 
    { 
     if (_bDisposed) 
      return; 

     if (disposing) 
     { 
      _context.Dispose(); 
     } 
     _bDisposed = true; 

     base.Dispose(disposing); 
    } 

    private bool _bDisposed; 

Ceci est un « Evacuer » mise en œuvre du modèle proposé par Bill Wagner dans « Effective C# » (Si je ne l'ai pas une erreur)

+2

Vous ne devriez pas enregistrer le conteneur avec lui-même. Voir la publication sur http://unity.codeplex.com/Thread/View.aspx?ThreadId=46415#Post156036 pour plus de détails. –

+0

Pas un lof de détails sauf: ne jamais enregistrer un conteneur avec lui-même. C'est déjà fait pour vous (nouveau dans Unity 1.2) donc vous ne gagnez rien, et vous aurez un débordement de pile au moment de la disposition. Ajoutez simplement une dépendance à IUnityContainer dans vos objets et cela fonctionnera. Mais cela m'explique beaucoup. :) Je vous remercie! – Budda

1

Avez-vous enregistré votre instance UnityManager dans le conteneur? Si c'est le cas, il sera éliminé par le conteneur lorsque le conteneur est disposé.

+0

Oh, d'accord. Merci! – Budda