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();
}