Существует абсолютно простой способ сделать это. SimpleInjector.Container
реализует System.IServiceProvider, который определяет метод object GetService(Type). Этот метод возвращает null
, когда тип не зарегистрирован. IServiceProvider
однако, реализуется в явном виде, что означает, что не обнаруживается при нормальном использовании, так что вы должны забрасывать Container
к IServiceProvider
, как показано ниже:
IServiceProvider provider = container;
object instance = provider.GetService(typeof(MyClass));
Или вы можете определить метод расширения сверху из этого:
public static bool TryGetInstance<TService>(
this Container container, out TService instance)
where TService : class
{
IServiceProvider provider = container;
instance = (TService)provider.GetService(typeof(TService));
return instance != null;
}
Должен признать, что эта функция немного скрыта. Единственное место, где в настоящее время объясняется this method, находится в справочной библиотеке.
Обратите внимание, что в целом гораздо лучше регистрировать Null Object Pattern реализации (пустые реализации без какого-либо поведения) вместо вызова метода TryGetInstance
. Инъекция Null Objects не позволяет приложениям беспокоиться о нулевых ссылках, что делает код приложения более понятным и более простым в тестировании.
Вы уверены, что вернули «Ничто»? Часто лучше возвращать [Null Object] (http://en.wikipedia.org/wiki/Null_Object_pattern) вместо возврата «null». Это также может избавить вас от необходимости вызывать контейнер из вашего приложения. – Steven
Да, в этом случае ничего лучше всего возвращать, потому что контрольная инструкция проверяет и загружает из другого источника. Это определено в стороннем наборе инструментов, поэтому я не могу контролировать эту условную логику. –