在本文中,我们将全面了解IServiceProvider
。
.NET Core中的IServiceProvider
接口是依赖注入(DI)系统的核心部分。它定义了一种检索服务对象的机制,这些服务对象是由依赖注入容器管理的类型的实例。理解IServiceProvider
的工作原理以及如何有效地使用它,对于构建模块化且易于维护的应用程序至关重要。
IServiceProvider
接口提供了一种从依赖注入容器中获取服务实例的方式。它有一个名为GetService
的方法,该方法用于检索指定类型的服务对象。Startup
类的ConfigureServices
方法中向依赖注入容器进行注册的。注册时需指定服务类型、实现类型以及服务生命周期。Startup
类中,你可以在ConfigureServices
方法里注册服务,如下所示:public classStartup
{
publicvoidConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyTransientService, MyTransientService>();
services.AddScoped<IMyScopedService, MyScopedService>();
services.AddSingleton<IMySingletonService, MySingletonService>();
}
publicvoidConfigure(IApplicationBuilder app,IWebHostEnvironment env)
{
// 配置逻辑...
}
}
public classMyController:Controller
{
privatereadonlyIMyTransientService _transientService;
privatereadonlyIMyScopedService _scopedService;
privatereadonlyIMySingletonService _singletonService;
publicMyController(IMyTransientService transientService,IMyScopedService scopedService,IMySingletonService singletonService)
{
_transientService = transientService;
_scopedService = scopedService;
_singletonService = singletonService;
}
publicIActionResultIndex()
{
// 使用服务...
returnView();
}
}
IServiceProvider
: 虽然构造函数注入是首选的方式,但在某些情况下,你可能需要手动解析服务。可以通过注入IServiceProvider
来实现,示例如下:public classMyService
{
privatereadonlyIServiceProvider _serviceProvider;
publicMyService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
publicvoidDoSomething()
{
var transientService = _serviceProvider.GetService<IMyTransientService>();
transientService.PerformTask();
}
}
public classMyBackgroundService:BackgroundService
{
privatereadonlyIServiceProvider _serviceProvider;
publicMyBackgroundService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
protectedoverrideasyncTaskExecuteAsync(CancellationToken stoppingToken)
{
using(var scope = _serviceProvider.CreateScope())
{
var scopedService = scope.ServiceProvider.GetService<IMyScopedService>();
await scopedService.DoWork(stoppingToken);
}
}
}
IServiceScopeFactory
: 当当前上下文没有提供作用域时,IServiceScopeFactory
可用于手动创建作用域,示例如下:public classMyService
{
privatereadonlyIServiceScopeFactory _scopeFactory;
publicMyService(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
publicvoidDoSomething()
{
using(var scope = _scopeFactory.CreateScope())
{
var scopedService = scope.ServiceProvider.GetService<IMyScopedService>();
scopedService.PerformTask();
}
}
}
public classStartup
{
publicvoidConfigureServices(IServiceCollection services)
{
if(someCondition)
{
services.AddScoped<IMyService, MyServiceImplementation1>();
}
else
{
services.AddScoped<IMyService, MyServiceImplementation2>();
}
}
}
services.AddTransient<IMyService, MyService>();
services.AddScoped<IMyService, MyService>();
services.AddSingleton<IMyService, MyService>();
IServiceProvider
允许手动解析服务,但过度使用它可能会导致一种称为“服务定位器”的反模式,这种模式会隐藏依赖关系,使代码更难维护。通过理解并遵循这些概念和实践,你可以在.NET Core应用程序中使用IServiceProvider
有效地管理依赖关系和服务生命周期。