2009-11-18 48 views
2

可能是一个愚蠢的问题,但在调试期间,我只是想看看已经用我的Unity容器注册的类型。我试过在观察窗口中通过容器,但似乎无法找到我在找的东西?我期待在那里有一个注册类型列表的地方?统一视图调试期间的注册类型

在此先感谢

+0

是的,我以前使用过Windsor,并设法获得这些信息。我现在被迫使用Unity,并且需要知道如何为Unity专门做。 – 2009-11-19 10:02:31

回答

4

我认为它是在那里,但它很埋。我通常使用以下扩展名:

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)); 
     } 
    } 
} 

然后,你可以这样写代码:

[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>()); 
    } 

您可以使用此方法,或者你可以换或改变源容器添加DebuggerDisplay属性以及使用上述代码遍历容器内容的方法。

希望这会有所帮助!

+4

Unity 2.0支持使上述代码过时的容器Registrations枚举和IsRegistered方法。 – 2010-04-03 20:12:38

+0

抱歉 - 阅读此评论的时间太晚。 使我的答案过时... – 2011-12-09 14:14:26

1

您不需要为此注册扩展名。 在容器的调试器视图中,简单地展开“注册” 在那里展开用两个箭头标记的“结果视图”。 这将枚举注册,您可以扩展它们。

Unity container view

+0

它不完全漂亮......在你的屏幕截图中,我看不到一个单一的注册显示,这表明我不得不向下钻几层?我试图自己做这个,很快就迷路了! – 2017-03-31 11:30:40