什么框架使用`IServiceProvider`?

时间:2013-02-04 20:40:33

标签: c# inversion-of-control

IServiceProvider基本上只是任何IOC容器的通用接口,还是用于特定框架?我正在滚动我自己的轻量级IOC容器,我想知道我是否应该实现它。我应该实现其他任何接口吗?我对MEF或Unity都不感兴趣。我已广泛使用它们并且它们并不适用于我当前的项目。

4 个答案:

答案 0 :(得分:4)

IServiceProvider是一个导入(或可能是保留)的COM接口,旨在用于查询服务对象的上下文中的私有功能。这里使用的术语“服务”相当宽松,它最初是指任何可以根据给定的GUID返回的COM对象。

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

在.NET中,除非您有一个专门支持它的客户端,否则不需要实现它,并且在许多情况下,您不需要添加使用{{1}隐含的另一个间接级别}。此外,您可以设计自己的方案来共享公共对象或实现基于IoC /依赖注入的其他使用模式,这些模式根据您的需求更灵活或更严格。

IServiceProvider的一个很好的历史背景是IE浏览器插件规范。这里,它用于允许插件组件在上下文中使用浏览器主机功能。在COM上下文中,此接口很有用,因为它隐藏了实例化的细节,也可以用作对象构造和利用策略的一部分,以避免引用循环。

WebBrowser Customization (Part 2) @ MSDN

答案 1 :(得分:2)

我认为这是一个非常通用的界面,因此您可以将它与任何东西一起使用。它几乎不应该在Framework类库中。对于一个特定用途,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。

除此之外,除非这只是一个学术练习,否则您可能需要阅读“依赖注入”。 Mark Seemann涵盖了每个容器以及相当多的理论和实践。也就是说,我强烈推荐它。

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

答案 2 :(得分:1)

ASP.NET 5在“自托管”模式下使用IServiceProvider,即在控制台应用程序或服务中托管ASP.NET应用程序和运行时。 (类型为Microsoft.Framework.Runtime.Common.DependencyInjection.ServiceProvider的对象 - 实现IServiceProvider - 将传递给您的控制台应用程序构造函数。)

因此,如果您想在ASP.NET 5中使用不同的IoC容器,您可能希望实现此接口。或者将另一个IoC容器包装在一个实现此接口的类中。

答案 3 :(得分:0)

新的(从.NET 4开始)运行时缓存API也使用它:http://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.host.aspx

还有Visual Studio设计师。

相关问题