5

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

4

4 回答 4

4

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

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

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

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

WebBrowser 自定义(第 2 部分)@ MSDN

于 2013-02-04T21:09:36.663 回答
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。

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

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

于 2013-02-04T20:46:48.570 回答
1

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

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

于 2015-07-23T12:59:40.670 回答
0

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

还有 Visual Studio 设计师。

于 2014-07-25T14:16:38.990 回答