IServiceProvider
基本的に、IOCコンテナの単なる汎用インターフェイスですか、それとも特定のフレームワークに使用されますか?私は自分の軽量IOCコンテナをローリングしていて、それを実装する必要があるかどうかを知りたいと思っています。実装する必要のある他のインターフェイスはありますか?MEFにもUnityにもあまり興味がありません。私は両方を広範囲に使用しましたが、現在のプロジェクトでは実際には機能しません。
4 に答える
IServiceProvider
Service について問い合わせるオブジェクトのコンテキストでプライベート機能に使用することを目的とした、インポートされた (またはおそらく保持された) COM インターフェイスです。「サービス」という用語は、ここではかなり大まかに適用されます。もともとは、与えられた GUID に基づいて返される可能性のある任意の COM オブジェクトを意味していました。
IServiceProvider @ MSDN (.NET リファレンス)
IServiceProviderImpl クラス @ MSDN (C++ ATL リファレンス)
.NET では、それを特にサポートするクライアントがない限り実装する必要はありません。多くの場合、.NET を使用することによって暗示される別のレベルの間接化を追加する必要はありませんIServiceProvider
。また、共通オブジェクトを共有する独自のスキームを考案したり、IoC / 依存性注入に基づいて他の使用パターンを実装したりすることもできます。これらは、ニーズに応じてより柔軟またはより厳格になります。
IServiceProvider
IE ブラウザ プラグインの仕様は、1 つの優れた歴史的背景です。ここでは、プラグイン コンポーネントがブラウザ ホスト機能をコンテキスト内で使用できるようにするために使用されます。COM コンテキストでは、このインターフェイスはインスタンス化の詳細を隠し、参照ループを回避するためにオブジェクトの構築および利用戦略の一部として使用できるため、便利です。
かなり汎用的なインターフェースだと思いますので、何にでも使えます。フレームワーク クラス ライブラリに存在することさえほとんどないはずです。1 つの具体的な用途については、WCF Data Services チームの Alex D. James がブログで説明しています。
IoCコンテナとは何の関係もないと思います。私は Unity と Autofac をかなり使用してきましたが、どちらとも使用されているのを見たことがありません。独自のロールについては、より標準的な一般的な方法で独自のコンテナー インターフェイスを定義することをお勧めします。
public interface IContainer
{
T Resolve<T>();
}
これはかなり標準的なものですが、必要に応じて IServiceProvider を使用することもできます。
その上で、これが単なる学術的な演習でない限り、「依存性注入」を読みたいと思うかもしれません。Mark Seemann は、そこにあるすべてのコンテナーと、かなりの理論と実践について説明しています。つまり、強くお勧めします。
https://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/
新しい (.NET 4 以降) ランタイム キャッシュ API もこれを使用します: http://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.host.aspx。
また、Visual Studio デザイナーでもあります。