ASP.NET Core中singleton生命周期的服务如何注入Scoped服务?

·

1 min read

假设有两个服务,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>();
}