2012-04-09 27 views
4

我想知道簡單注射器是否有一個選項可以阻止在任何時候拋出異常GetInstance(Of TService)返回Nothing?它似乎現在正在拋出它們,因爲我有兩個請求來獲取一個實例,它不在那裏,它會拋出異常。防止簡單的注射器在解決未註冊的服務時拋出異常

有沒有辦法來防止默認行爲,設置某處或其他東西?

+0

你確定返回'Nothing'是一種有效的情況嗎?通常最好返回一個[空對象](http://en.wikipedia.org/wiki/Null_Object_pattern)而不是返回null。這也可以使您不必從應用程序中調用容器。 – Steven 2012-04-09 16:53:32

+0

是的,在這種情況下,最好不要返回Nothing,因爲後續語句會檢查並從另一個源加載。這是在第三方工具集內定義的,所以我無法控制該條件邏輯。 – 2012-04-09 18:07:44

回答

12

絕對有一個簡單的方法來做到這一點。 SimpleInjector.Container實現了System.IServiceProvider,其定義了一種方法object GetService(Type)。當某種類型未註冊時,此方法返回null。該IServiceProvider然而,明確實施,這意味着它不正常使用情況下出現,所以你要投的ContainerIServiceProvider,如下圖所示:

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方法要好得多。注入空對象可以防止應用程序不必擔心空引用,這使得應用程序代碼更易於理解並且更容易測試。

+0

新版本中是否有任何更新?此外,參考庫的鏈接被打破,我找不到新的。 – mrmashal 2016-01-23 19:23:29

+0

@mrmashal在v3這方面沒有任何改變。 – Steven 2016-01-23 23:09:48