ASP.NET Core 内置 IoC 容器
ASP.NET Core 框架包括用于自动依赖注入的内置 IoC 容器。内置 IoC 容 器是一个简单而有效的容器。让我们了解内置 IoC 容器是如何在内部工作的。
以下是内置 IoC 容器的重要接口和类:
接口:
- IServiceProvider
- IServiceCollection
类:
- ServiceProvider
- ServiceCollection
- ServiceDescription
- ServiceCollectionServiceExtensions
- ServiceCollectionContainerBuilderExtensions
下图说明了这些类之间的关系:

IServiceCollection
如您所知,我们可以使用 IServiceCollection 在 Startup 类的 Configure 方法中使用内置 IoC 容器注册应用程序服务。IServiceCollection 接口是空接口。它只是继承 IList<servicedescriptor>。请参阅此处的源代码。
ServiceCollection 类实现 IServiceCollection 接口。
因此,您在 IServiceCollection 类型实例中添加的服务实际上创建了 ServiceDescriptor 的实例并将其添加到列表中。
IServiceProvider
IServiceProvider 包含 GetService 方法。ServiceProvider 类实现 IServiceProvider 接口,该接口使用容器返回注册的服务。我们无法实例化 ServiceProvider 类,因为它的构造函数用内部访问修饰符标记。
ServiceCollectionServiceExtensions
ServiceCollectionServiceExtensions 类包含与服务注册相关的扩展方法,可用于添加具有生存期的服务。此类中定义的 AddSingleton、AddTransient、AddScoped 扩展方法。
ServiceCollectionContainerBuilderExtensions
ServiceCollectionContainerBuilderExtensions 类包含创建并返回 ServiceProvider 实例的 BuildServiceProvider 扩展方法。
有 3 种方法可以获取 IServiceProvider 的实例:
1. 使用 IApplicationBuilder
我们可以使用 IApplicationBuilder 的 ApplicationServices 属性在 Configure 方法中获取服务,如下所示。
public void Configure(IServiceProvider pro, IApplicationBuilder app, IHostingEnvironment env){var services = app.ApplicationServices;var logger = services.GetService<ILog>() }//other code removed for clarity}
2. 使用 HttpContext
var services = HttpContext.RequestServices;var log = (ILog)services.GetService(typeof(ILog));
3. 使用 IServiceCollection
public void ConfigureServices(IServiceCollection services){var serviceProvider = services.BuildServiceProvider();}