4

Мне было интересно, если Simple Injector имеет возможность прекратить бросать исключения, когда GetInstance(Of TService) возвращает Nothing? Кажется, он бросает их сейчас, потому что у меня есть два запроса на получение экземпляра, его нет, и он выдает исключение.Предотвращение простого инжектора для исключения исключения при разрешении незарегистрированной службы

Есть ли способ предотвратить поведение по умолчанию, настройку где-то или что-то еще?

+0

Вы уверены, что вернули «Ничто»? Часто лучше возвращать [Null Object] (http://en.wikipedia.org/wiki/Null_Object_pattern) вместо возврата «null». Это также может избавить вас от необходимости вызывать контейнер из вашего приложения. – Steven

+0

Да, в этом случае ничего лучше всего возвращать, потому что контрольная инструкция проверяет и загружает из другого источника. Это определено в стороннем наборе инструментов, поэтому я не могу контролировать эту условную логику. –

ответ

12

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

+0

Есть ли обновления в этом в новых версиях? Также ссылка на справочную библиотеку сломана, и я не смог ее найти. – mrmashal

+0

@mrmashal ничего не изменилось в v3 в этом отношении. – Steven

Смежные вопросы