基本上只是任何 IOC 容器的IServiceProvider
通用接口,还是用于特定框架?我正在滚动我自己的轻量级 IOC 容器,我想知道是否应该实施它。还有其他我应该实现的接口吗?我对 MEF 或 Unity 都不感兴趣。我已经广泛使用了这两种方法,但它们并不真正适用于我当前的项目。
4 回答
IServiceProvider
是一个导入的(或者可能是保留的)COM 接口,旨在用于您为服务询问的对象的上下文中的私有功能。术语“服务”在这里应用得相当松散,它最初是指可以根据给定的 GUID 返回的任何 COM 对象。
IServiceProvider @ MSDN(.NET 参考)
IServiceProviderImpl Class @ MSDN(C++ ATL 参考)
在 .NET 中,除非您有专门支持它的客户端,否则您不需要实现它,并且在许多情况下,您不需要添加使用IServiceProvider
. 此外,您可以设计自己的方案来共享公共对象或实现基于 IoC / 依赖注入的其他使用模式,这些模式根据您的需要更灵活或更严格。
一个很好的历史背景IServiceProvider
是 IE 浏览器插件规范。在这里,它用于允许插件组件在上下文中使用浏览器主机功能。在 COM 上下文中,此接口很有用,因为它隐藏了实例化的细节,也可以用作对象构造和利用策略的一部分,以避免引用循环。
我认为这是一个非常通用的使用界面,因此您可以将其与任何东西一起使用。它几乎不应该在框架类库中。对于一个特定用途,WCF 数据服务团队的 Alex D. James 有一篇关于它的博客。
我认为这与 IoC 容器无关。我已经使用过很多 Unity 和 Autofac,但从未见过它与它们一起使用。至于自己滚动,我建议您以更标准的通用方式定义自己的容器接口:
public interface IContainer
{
T Resolve<T>();
}
这是相当标准的一些变化,但如果符合您的需要,您也可以只使用 IServiceProvider。
在那一点上,除非这只是一个学术练习,否则您可能需要阅读“依赖注入”。Mark Seemann 涵盖了所有的容器以及相当多的理论和实践。也就是说,我强烈推荐它。
https://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/
ASP.NET 5IServiceProvider
在“自托管”模式下使用,即在控制台应用程序或服务中托管 ASP.NET 应用程序和运行时。
(一个类型的对象Microsoft.Framework.Runtime.Common.DependencyInjection.ServiceProvider
——实现IServiceProvider
——被传递给你的控制台应用程序构造函数。)
因此,如果您想在 ASP.NET 5 中使用不同的 IoC 容器,您可能需要实现此接口。或者将另一个 IoC 容器包装在实现此接口的类中。
新的(从 .NET 4 开始)运行时缓存 API 也使用它:http: //msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.host.aspx。
还有 Visual Studio 设计师。