ASP.NET Core 内置 IoC 容器

ASP.NET Core 框架包括用于自动依赖注入的内置 IoC 容器。内置 IoC 容 器是一个简单而有效的容器。让我们了解内置 IoC 容器是如何在内部工作的。

以下是内置 IoC 容器的重要接口和类:

接口

  • IServiceProvider
  • IServiceCollection

类:

  • ServiceProvider
  • ServiceCollection
  • ServiceDescription
  • ServiceCollectionServiceExtensions
  • ServiceCollectionContainerBuilderExtensions

下图说明了这些类之间的关系:


IServiceCollection

如您所知,我们可以使用 IServiceCollectionStartup 类的 Configure 方法中使用内置 IoC 容器注册应用程序服务。IServiceCollection 接口是空接口。它只是继承 IList<servicedescriptor>。请参阅此处的源代码。

ServiceCollection 类实现 IServiceCollection 接口。

因此,您在 IServiceCollection 类型实例中添加的服务实际上创建了 ServiceDescriptor 的实例并将其添加到列表中。


IServiceProvider

IServiceProvider 包含 GetService 方法。ServiceProvider 类实现 IServiceProvider 接口,该接口使用容器返回注册的服务。我们无法实例化 ServiceProvider 类,因为它的构造函数用内部访问修饰符标记。


ServiceCollectionServiceExtensions

ServiceCollectionServiceExtensions 类包含与服务注册相关的扩展方法,可用于添加具有生存期的服务。此类中定义的 AddSingletonAddTransientAddScoped 扩展方法。


ServiceCollectionContainerBuilderExtensions

ServiceCollectionContainerBuilderExtensions 类包含创建并返回 ServiceProvider 实例的 BuildServiceProvider 扩展方法。

有 3 种方法可以获取 IServiceProvider 的实例:

1. 使用 IApplicationBuilder

我们可以使用 IApplicationBuilderApplicationServices 属性在 Configure 方法中获取服务,如下所示。

  1. public void Configure(IServiceProvider pro, IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. var services = app.ApplicationServices;
  4. var logger = services.GetService<ILog>() }
  5. //other code removed for clarity
  6. }
2. 使用 HttpContext
  1. var services = HttpContext.RequestServices;
  2. var log = (ILog)services.GetService(typeof(ILog));

3. 使用 IServiceCollection
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. var serviceProvider = services.BuildServiceProvider();
  4. }

分类导航