私のaspnetコアアプリは、指定された時間間隔でデータをクロールする必要があります。 IHostedServiceの実装を選択して、APIと並行して実行しました。このホストされるサービスには、いくつかのサービスを挿入する必要があります。今のところ、起動時にそれらを登録しますが、このエラーが発生します:
System.InvalidOperationException: 'シングルトン' Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor 'からスコープサービス' IXService 'を使用できません。
私のstartup.cs:
services.AddScoped<IXService, XService>();
services.AddHostedService<MyHostedService>();
DbContextでも同様の問題がありましたが、 https://stackoverflow.com/a/48368934/84751 で解決しましたが、今回は、より深いレイヤーを通過してIServiceScopeFactoryを処理する依存関係の注入が必要ですそれぞれがエレガントな解決策ではないようです。
これを許可されていない理由は、MyHostedServiceの有効期間がシングルトンであり、スコープよりも長い有効期間であるためです。ここでの基本的な前提は、スコープ付きとして登録されたサービスを無期限に存続させるべきではないということです。これは、シングルトンサービスがスコープ付きサービスへの参照を保持している場合に簡単に発生する可能性があります。
私が探している解決策は、IServiceProviderをMyHostedServiceに挿入し、それを使用して、必要に応じて新しいスコープと新しいXServiceインスタンスを作成することだと思います。
つまり、置き換える
_xService.Foo();
と
using(var scope = _serviceProvider.CreateScope()) {
var xService = scope.ServiceProvider.GetService<IXService>();
xService.Foo();
}
もちろん、代わりに、AddScopedの呼び出しをAddSingletonに置き換えるだけで、XServiceをシングルトンとして登録することもできますが、お勧めしません。
編集:私の返信を投稿する前に、リンクを読んでいないことを認めなければなりません。しかし、私はまだこれが最もエレガントなソリューションだと思います。