ライフサイクルをScopedの依存として登録し、ライフサイクルがSingletonに登録されているクラスに注入します.

1514 ワード

ライフサイクルをScopedの依存として登録し、ライフサイクルがSingletonに登録されているクラスに注入します。

  • ソリューション
  • 参照
  • ここをクリックして原文を表示
    最近のプロジェクトでは、Quartzと結合しています.NETとIHostedServiceが実現する.NET Coreコンソールの計画タスク.このプロジェクトでは、DbContextを注入してデータベース接続と操作を行う必要があります.IServiceCollectionの拡張方法AddDbContextは、DbContextScoped型のライフサイクルに注入するものであり、Quartz.NETはIJobFactoryISchedulerFactorySingleton型に注入することを要求している.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