Unity视图在调试期间注册类型

时间:2009-11-18 14:08:41

标签: .net inversion-of-control unity-container

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

提前致谢

2 个答案:

答案 0 :(得分: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属性,以及使用上述代码迭代容器内容的方法。

希望这有帮助!

答案 1 :(得分:2)

您无需为此注册扩展程序。 在容器的调试器视图中,只需展开“注册” 用两个箭头展开圆圈标记的“结果视图”。 这将枚举注册,您可以扩展它们。

Unity container view