ライフサイクルをScopedの依存として登録し、ライフサイクルがSingletonに登録されているクラスに注入します.
ライフサイクルをScopedの依存として登録し、ライフサイクルがSingletonに登録されているクラスに注入します。
最近のプロジェクトでは、Quartzと結合しています.NETと
IHostedService
が実現する.NET Coreコンソールの計画タスク.このプロジェクトでは、DbContext
を注入してデータベース接続と操作を行う必要があります.IServiceCollection
の拡張方法AddDbContext
は、DbContext
をScoped
型のライフサイクルに注入するものであり、Quartz.NETはIJobFactory
とISchedulerFactory
をSingleton
型に注入することを要求している.Singleton
タイプのクラスにScoped
タイプの依存項目を直接注入すると、「SingletonでScopedタイプのサービスを使用できない」というエラーが投げ出されます.Cannot consume scoped service 'XXX' from singleton 'XXX'.
ソリューション
Scoped
タイプの依存を使用する必要があるクラスでは、この依存を直接注入するのではなく、IServiceScopeFactory
依存を注入します.public class MySingletonService : IMySingletonService
{
private readonly IServiceScopeFactory _scopeFactory;
public MySingletonService(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
}
Scoped
型の依存を使用する必要がある方法では、IServiceScopeFactoryのインスタンスを使用して依存を解析します.public class MySingletonService : IMySingletonService
{
// Other code
public void Scoped()
{
using var scope = _scopeFactory.CreateScope();
var ctx = scope.ServiceProvider.GetRequiredService();
// Other code
}
}
リファレンス
点此查看原文原文:Chi Blog