Могу ли я проверить, зарегистрирован ли тип в контейнере Unity, не вызывая Resolve и не перехватывая исключение?
Проверка того, зарегистрирован ли тип в Unity
Ответы (2)
В Unity 2.0 будет метод IsRegistered
, который вы можете использовать, чтобы узнать, зарегистрирован ли тип в контейнере.
Первая бета-версия Unity 2.0 доступна на Codeplex с 10 февраля. См. примечания к выпуску и загрузите его здесь; http://unity.codeplex.com/wikipage?title=Unity2%20Beta1
ОБНОВИТЬ:
Загрузил и протестировал первую бета-версию 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:
Этот метод полезен, если вы зарегистрировали несколько типов с одним и тем же типом, но с разными именами.
Имейте в виду, что этот метод НЕ возвращает экземпляр для регистрации по умолчанию (без имени).
Ваш единственный другой вариант (в настоящее время) - использовать ResolveAll<T>()
и перечислить результаты.