ASP.NET Core中singleton生命周期的服务如何注入Scoped服务?
假设有两个服务,Student 和 Major,其中 Student 服务的生命周期注入为 Singleton,Major 服务的生命周期注入为 Scoped。
builder.Services.AddSingleton<Student>();
builder.Services.AddScoped<Major>();
其中 Student 服务中依赖 Major:
class Student
{
private readonly Major _major;
public Student(Major major)
{
_major = major;
}
}
此时运行项目,报错 System.AggregateException
。
因为 Singleton 单例生命周期的服务里依赖 Scoped 范围生命周期的服务是会报错的,
解决方式一:
使用 IServiceScopeFactory
public calss Student
{
private readonly Major _major;
private readonly IServiceScopeFactory _serviceScopeFactory;
public Student(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
_major = _serviceScopeFactory.CreateScope().ServiceProvider.GetRequiredService<Major>();
}
}
解决方式二:
使用 IServiceProvider
public Student(IServiceProvider provider)
{
_major = provider.CreateScope().ServiceProvider.GetRequiredService<Major>();
}