Unity просмотр зарегистрированных типов во время отладки - PullRequest
2 голосов
/ 18 ноября 2009

Возможно глупый вопрос, но во время отладки я просто хочу увидеть типы, которые были зарегистрированы в моем контейнере Unity. Я пытался пройти через контейнер в окне часов, но не могу найти то, что искал? Я ожидаю, что где-нибудь будет список зарегистрированных типов?

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 06 января 2010

Я думаю, что он там, но он довольно похоронен. Обычно я использую следующее расширение:

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 и метод, который использует приведенный выше код для перебора содержимого контейнера.

Надеюсь, это поможет!

2 голосов
/ 09 декабря 2011

Вам не нужно регистрировать расширение для этого. В представлении отладчика контейнера просто разверните «Регистрация» Там разверните «Просмотр результатов», отмеченный кружком с двумя стрелками. Это будет перечислять регистрации, и вы можете расширить их.

Unity container view

...