2009-11-18 4 views
2

Peut-être une question stupide, mais pendant le débogage je veux simplement voir les types qui ont été enregistrés avec mon conteneur Unity. J'ai essayé de passer par le conteneur dans la fenêtre de la montre, mais je n'arrive pas à trouver ce que je cherche? Je m'attends à ce qu'il y ait une liste de types enregistrés quelque part?Unity view Types enregistrés pendant le débogage

Merci à l'avance

+0

Oui, j'ai utilisé Windsor avant et a réussi à obtenir cette information. Je suis obligé d'utiliser Unity pour le moment et j'ai besoin de savoir comment le faire pour Unity en particulier. –

Répondre

4

je pense qu'il est là-dedans, mais il est assez enterré. En général, j'utilise l'extension suivante:

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using Microsoft.Practices.Unity; 

namespace NBody.Viewer.Unity 

{ 
    public class QueryableContainerExtension : UnityContainerExtension 
    { 
     private List<RegisterEventArgs> _registrations; 
     public IList<RegisterEventArgs> Registrations 
     { 
      get { return new ReadOnlyCollection<RegisterEventArgs>(_registrations); } 
     } 

     private List<RegisterInstanceEventArgs> _instanceRegistrations; 
     public IList<RegisterInstanceEventArgs> InstanceRegistrations 
     { 
      get { return new ReadOnlyCollection<RegisterInstanceEventArgs>(_instanceRegistrations); } 
     } 

     protected override void Initialize() 
     { 
      _registrations = new List<RegisterEventArgs>(); 
      _instanceRegistrations = new List<RegisterInstanceEventArgs>(); 
      Context.Registering += (s, e) => _registrations.Add(e); 
      Context.RegisteringInstance += (s, e) => _instanceRegistrations.Add(e); 
     } 

     public bool IsTypeRegistered<TFrom, TTo>() 
     { 
      return _registrations.Exists(e => e.TypeFrom == typeof(TFrom) && e.TypeTo == typeof(TTo)); 
     } 

     public bool IsTypeRegistered<TFrom>() 
     { 
      return _registrations.Exists(e => e.TypeFrom == typeof(TFrom)); 
     } 
    } 
} 

Ensuite, vous pouvez écrire du code comme ceci:

[Fact] 
    public void IsTypeRegisteredReturnsTrueForRegisteredType() 
    { 
     QueryableContainerExtension target = new QueryableContainerExtension(); 
     IUnityContainer container = new UnityContainer(); 
     container.AddExtension(target); 

     container.RegisterType<IEnumerable, Array>(); 

     Assert.True(target.IsTypeRegistered<IEnumerable, Array>()); 
     Assert.True(target.IsTypeRegistered<IEnumerable>()); 
     Assert.False(target.IsTypeRegistered<IEnumerable, SortedList>()); 
     Assert.False(target.IsTypeRegistered<IList>()); 
    } 

Vous pouvez utiliser cette approche ou vous pouvez envelopper ou modifier la source pour le conteneur pour ajouter un attribut DebuggerDisplay et une méthode qui utilise le code ci-dessus pour parcourir le contenu du conteneur.

Espérons que cela aide!

+4

Unity 2.0 prend en charge une énumération des enregistrements de conteneur et une méthode IsRegistered qui rend le code ci-dessus obsolète. –

+0

Désolé - lire ce commentaire trop tard. Rend ma réponse obsolète ... –

1

Vous n'avez pas besoin d'enregistrer une extension pour cela. Dans la vue du débogueur du conteneur, il suffit de développer "Registrations" Il y a une extension de la "vue des résultats" marquée par le cercle avec les deux flèches. Cela va énumérer les enregistrements et vous pouvez les développer.

Unity container view

+0

Ce n'est pas exactement joli ... dans votre capture d'écran je ne peux pas voir une seule inscription affichée, ce qui suggère que je devrais explorer plusieurs couches? J'ai essayé de le faire moi-même et je me suis rapidement perdu! –

Questions connexes