我想知道簡單注射器是否有一個選項可以阻止在任何時候拋出異常GetInstance(Of TService)
返回Nothing
?它似乎現在正在拋出它們,因爲我有兩個請求來獲取一個實例,它不在那裏,它會拋出異常。防止簡單的注射器在解決未註冊的服務時拋出異常
有沒有辦法來防止默認行爲,設置某處或其他東西?
我想知道簡單注射器是否有一個選項可以阻止在任何時候拋出異常GetInstance(Of TService)
返回Nothing
?它似乎現在正在拋出它們,因爲我有兩個請求來獲取一個實例,它不在那裏,它會拋出異常。防止簡單的注射器在解決未註冊的服務時拋出異常
有沒有辦法來防止默認行爲,設置某處或其他東西?
絕對有一個簡單的方法來做到這一點。 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
方法要好得多。注入空對象可以防止應用程序不必擔心空引用,這使得應用程序代碼更易於理解並且更容易測試。
你確定返回'Nothing'是一種有效的情況嗎?通常最好返回一個[空對象](http://en.wikipedia.org/wiki/Null_Object_pattern)而不是返回null。這也可以使您不必從應用程序中調用容器。 – Steven 2012-04-09 16:53:32
是的,在這種情況下,最好不要返回Nothing,因爲後續語句會檢查並從另一個源加載。這是在第三方工具集內定義的,所以我無法控制該條件邏輯。 – 2012-04-09 18:07:44