IServiceProvider.GetService(Type serviceType)
メソッド署名との意図に違いはありIServiceLocator.GetInstance(Type serviceType)
ますか? もしそうなら、違いは何ですか?
私は常にそれらを同等のものとして扱ってきましたが、一貫性を保つために単一の方法を使用することにしました。これは 2 つのインターフェイスを扱うのに十分な解決策のように思えますが、正しい場所で正しいものを使用していることを確認できるように、それらの使用法が実際にどのように意図されていたかを知りたいと思っています。 それらの意図が実際に同じである場合、同じ目的のために複数のセマンティクスのセットを持つ理由はありますか? (の開始時に署名が推奨されていたことは理解していGetInstance
Microsoft.Practices.ServiceLocation
ますが、これは重複を導入する正当な理由とは思えません)。
なぜ私は混乱しています
以下は、この質問に対する答えを見つけようとして見つけた矛盾する事実と、それに対する私の解釈のリストです。これらを含めているのは、このトピックについて既に知られているすべての情報のコンテキストで私の質問に対処できるようにするためです.
のMSDNドキュメントに
IServiceProvider
は、GetService(Type serviceType)
メソッドが返す必要があると書かれていますタイプserviceType のサービス オブジェクト。
- または - serviceType型のサービス オブジェクトがない場合は
null。のMSDN ドキュメントに
IServiceLocator
はメソッドのドキュメントがありませんが、VS オブジェクト ブラウザの概要にはGetInstance(Type serviceType)
、メソッドが「要求されたサービス インスタンス」を返すと記載されています。ただし、ドキュメントIServiceLocator
には、サービス インスタンスの解決中にエラーが発生した場合に をスローするActivationException
必要があるという例外エントリもあります。ActivationException
が導入されてから数年後に導入されたMicrosoft.Practices.ServiceLocation
名前空間にありますIServiceProvider
。IServiceProvider
したがって、が例外を参照していないことは理解できます。そうは言っても、IServiceLocator
インターフェイスのドキュメントにはnull
、結果が見つからない場合に戻ることについては何も書かれていません。また、要求されたサービス タイプの実装の欠如が例外を構成する必要があるかどうかも明らかではありません。サービス タイプの実装がない場合、
ActivationException
inIServiceLocator
実装が発生する必要がありますか? それのようには見えません。の実装テンプレートIServiceLocator
は、null 以外の事後条件の概念 を無視します。の実装テンプレートも、 の代替構文として
IServiceLocator
扱います。これは Liskov の違反 (基本型で宣言されていないサブタイプで例外をスローするため) と見なされますか? それとも、インターフェイスのメソッド シグネチャで宣言された例外ではなく、実際に実装に違いが必要でしょうか? 私が得ているのは、実装テンプレートが両方のインターフェースを正しく実装していると確信していますか? 呼び出しを try ブロックでラップし、例外がキャッチされたときに戻る というインターフェイスの意図をより適切に表現できますか?IServiceProvider.GetService(Type)
IServiceLocator.GetInstance()
ServiceLocatorImplBase
IServiceLocator
IServiceProvider
GetInstance
null
補遺:これに関連するもう 1 つの問題は、への対応
IServiceLocator.GetAllInstances(Type)
ですIServiceLocator.GetInstance(Type)
。具体的には、任意の型 T について、 の実装はIServiceLocator.GetAllInstances(typeof(T))
と同じ結果を返す必要がありIServiceLocator.GetInstance(typeof(IEnumerable<>).MakeGenericType(typeof(T))
ますか? (これがIServiceProvider
通信にどのように関係しているかは簡単にわかりますが、質問を単純にして、この場合は同じインターフェースの 2 つのメソッドのみを比較する方がよいと思います。)