Тестирование, если Тип был зарегистрирован в Unity - PullRequest
7 голосов
/ 25 января 2009

Могу ли я проверить, был ли тип зарегистрирован в контейнере Unity, не вызывая Resolve и перехватывая исключение?

Ответы [ 2 ]

12 голосов
/ 27 февраля 2010

Unity 2.0 будет иметь метод IsRegistered, который вы можете использовать, чтобы узнать, был ли тип зарегистрирован в контейнере.

Бета-версия Unity 2.0 доступна в Codeplex с 10 февраля. Посмотрите примечания к выпуску и загрузите его здесь; http://unity.codeplex.com/wikipage?title=Unity2%20Beta1

UPDATE:

Загрузил и протестировал бета-версию Unity 2.0 27 февраля 2010 года, и он уже готов к работе. Если вы используете Unity 1.2 сегодня, вам придется проделать большую работу, чтобы заставить работать Unity 2.0 из-за неполного (?) Интерфейса IUnityContainer. Поэтому, если вы хотите, чтобы метод IsRegistered работал сегодня, вы можете создать метод расширения следующим образом:

public static class UnityContainerExtensions
{
    public static bool IsRegistered<T>(this IUnityContainer container)
    {
        try
        {
            container.Resolve<T>();
            return true;
        }
        catch
        {
            return false;
        }
    }
}

Обратите внимание, что я не использую ResolveAll здесь. Причина этого заключается в том, что ResolveAll не возвращает регистрацию по умолчанию (без имени), как указано в документах Unity:

Этот метод полезен, если вы зарегистрировали несколько типов с одним и тем же типом, но разными именами.

Имейте в виду, что этот метод НЕ возвращает экземпляр для регистрации по умолчанию (без имени).

2 голосов
/ 25 января 2009

Ваш единственный другой вариант (в настоящее время) - использовать ResolveAll<T>() и перечислять результаты.

...