2013-02-04 96 views
5

IServiceProvider基本上只是任何IOC容器的通用接口,還是用於特定框架?我正在滾動我自己的輕量IOC容器,我想知道我是否應該實施它。是否還有其他接口應該實現?我對MEF或Unity都不感興趣。我已經廣泛地使用了它們,並且它們並不適合我當前的項目。什麼框架使用`IServiceProvider`?

回答

4

IServiceProvider是進口的(或者是持有以上)COM預定於你的人詢問了服務對象的情況下被用於私人的功能界面。術語「服務」在這裏應用得相當寬鬆,它最初意味着任何COM對象都可以根據給定的GUID返回。

IServiceProvider @ MSDN (.NET reference)
IServiceProviderImpl Class @ MSDN (C++ ATL reference)

在.NET中,你不需要實現它,除非你有專門支持它的客戶,並且在很多情況下,你不會需要添加間接的另一個水平這是暗示使用IServiceProvider。此外,您可以設計自己的方案來共享通用對象或實現基於IoC /依賴注入的其他使用模式,這些模式根據您的需求而更靈活或更嚴格。

IServiceProvider的一個很好的歷史背景是IE瀏覽器插件規範。在此,它用於允許插件組件在上下文中使用瀏覽器主機功能。在COM環境中,此接口非常有用,因爲它隱藏了實例化的細節,還可以用作對象構建和利用策略的一部分,以避免引用循環。

WebBrowser Customization (Part 2) @ MSDN

2

我認爲這是一個非常通用的界面,所以你可以使用它。它幾乎不應該在框架類庫中。對於一個特定用途,WCF數據服務團隊的Alex D. James有一個關於它的博客。

http://blogs.msdn.com/b/alexj/archive/2010/01/07/creating-a-data-service-provider-part-2-iserviceprovider-datasources.aspx

我不認爲這有什麼關係IoC容器。我已經很多地使用了Unity和Autofac,並且從來沒有見過它用過。至於滾動你自己,我建議您在更標準的通用的方式定義自己的容器接口:

public interface IContainer 
{ 
    T Resolve<T>(); 
} 

,是與某種變化相當標準,但你也可以只使用的IServiceProvider如果符合您的需求。

並且在那個筆記上,除非這只是一個學術練習,否則您可能需要閱讀「依賴注入」。馬克塞曼涵蓋了所有的容器和相當多的理論和實踐。那就是,我強烈推薦它。

https://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/

+0

不錯!謝謝我會的。 – Jordan

1

ASP.NET 5在「自託管」模式下使用IServiceProvider,即在控制檯應用程序或服務中託管ASP.NET應用程序和運行時。
Microsoft.Framework.Runtime.Common.DependencyInjection.ServiceProvider類型的對象 - 實現IServiceProvider)被傳遞給您的控制檯應用程序構造函數。)

因此,如果您想在ASP.NET 5中使用不同的IoC容器,則可能需要實現此接口。或者將其他IoC容器包裝在實現此接口的類中。

+0

ASP.NET核心(以前的ASP.NET 5)總是使用'IServiceProvider',不僅在「自我託管」時。 – John