質問: 私のアプリケーションでは、NMSとActiveMQを使用して統合を行っています。メッセージのキューをリッスンするシングルトンのリスナーがいます。メッセージを受信すると、リスナーはそのメッセージを処理してデータベースに記録する必要があります。 `DbContext`は、 `DbContextPool`オプションを使用して構成されます。 ``` services.AddEntityFrameworkSqlServer(); services.AddDbContextPool((serviceProvider, options) => { options.UseSqlServer(connectionString); options.UseInternalServiceProvider(serviceProvider); }); ``` そのため、 `ActiveMqListener`クラスに`DbContext`を挿入しようとすると、エラーが発生します。 ``` InvalidOperationException: Cannot consume scoped service 'MyApp.Data.MyContext' from singleton 'MyApp.Integrations.ActiveMqListener'. ``` 1つのメッセージの処理が完了したら、プール内のコンテキストの1つを取得して解放するにはどうすればよいですか?これを行う他の推奨方法はありますか? 前もって感謝します。
回答: ASP.NET Core DI Serviceの有効期間に関するドキュメントによると: > スコープ付きサービスをシングルトンから解決することは危険です。後続のリクエストを処理するときに、サービスが誤った状態になる可能性があります。 > > 既定では、 `AddDbContext`または`AddDbContextPool`は`DbContext`を`Scoped`サービスとして登録します。あなたは消費している`DbContext`で`ActiveMqListener`として登録されているクラスの`Singleton`サービスを。それが問題です! **解決策は以下のとおりです。**ご登録`ActiveMqListener`としてASP.NETコアDIに`ScopedService`に`Startup.ConfigureServices`方法。 注: `ActiveMqListener`を`Singleton`として使用する必要がある場合は、次のように`DbConext`も`Singleton`として登録します。 ``` services.AddDbContext((serviceProvider, options) => { options.UseSqlServer(connectionString); options.UseInternalServiceProvider(serviceProvider); }, ServiceLifetime.Singleton); // <-- Here it is ```