2012-04-09 11 views
4

GetInstance(Of TService)Nothingを返すと、Simple Injectorに例外スローを停止するオプションがあるのだろうか?インスタンスを取得する要求が2つあり、そこには存在せず、例外がスローされているため、現在はスローされているようです。登録されていないサービスを解決する際にシンプルインジェクタが例外をスローするのを防ぐ

デフォルトの動作、設定の変更などを防ぐ方法はありますか?

+0

「Nothing」を返すことは有効ですか? 'null'を返すのではなく、[Null Object](http://en.wikipedia.org/wiki/Null_Object_pattern)を返すほうがよい場合がよくあります。これにより、アプリケーション内からコンテナを呼び出す必要がなくなります。 – Steven

+0

はい、このシナリオでは、フォローアップステートメントが別のソースからチェックして読み込むため、Nothingが返されることをお勧めします。これは第三者ツールセット内で定義されているため、私はその条件付きロジックを制御できません。 –

答えて

12

これを行う簡単な方法は絶対ありません。 SimpleInjector.ContainerSystem.IServiceProviderを実装しており、これはobject GetService(Type)メソッドを定義しています。型が登録されていない場合、このメソッドはnullを返します。 IServiceProviderは、しかし、それは通常の使用の下に表示されないことを意味する、明示的に実装されているので、あなたは、以下に示すように、IServiceProviderContainerをキャストする必要があります。

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は現在参照ライブラリに記載されています。

は、一般的に、代わりにTryGetInstanceメソッドを呼び出すNull Object Pattern実装(任意の行動のない空の実装)を登録するためにはるかに優れていることに注意してください。ヌルオブジェクトを挿入すると、アプリケーションがヌル参照を心配する必要がなくなるため、アプリケーションコードの理解が容易になり、テストが容易になります。

+0

新しいバージョンのこれに関する更新はありますか?また、参照ライブラリへのリンクが壊れていて、新しいライブラリを見つけることができませんでした。 – mrmashal

+0

@mrmashalこの点でv3では何も変更されていません。 – Steven

関連する問題