Запретить Simple Injector для исключения при разрешении незарегистрированного сервиса
Мне было интересно, есть ли у Simple Injector возможность прекращать генерировать исключения всякий раз, когда GetInstance(Of TService)
возвращается Nothing
? Похоже, что теперь он их выбрасывает, потому что у меня есть два запроса на получение экземпляра, его там нет, и он выдает исключение.
Есть ли способ предотвратить поведение по умолчанию, параметр где-то или что-то еще?
1 ответ
Там абсолютно простой способ сделать это. SimpleInjector.Container
реализует System.IServiceProvider, который определяет метод объекта 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;
}
Я должен признать, что эта функция немного скрыта. Единственное место, где этот метод в настоящее время объясняется, находится в справочной библиотеке.
Обратите внимание, что в общем случае гораздо лучше зарегистрировать реализации Null Object Pattern (пустые реализации без какого-либо поведения) вместо вызова TryGetInstance
метод. Внедрение нулевых объектов предотвращает беспокойство приложения о пустых ссылках, что делает код приложения более простым для понимания и тестирования.