質問: someEntity.Id }; dbContext.RelatedEntity.Add(relatedEntity) dbContext.SaveChanges(); transaction.Commit(); } ``` ここでは、作成した別のエンティティに関連するエンティティのIDを取得するためにコンテキストを保存する必要があります。 同時に、別のサービスが同じコンテキストを更新する可能性があります。私が読んだものから、 `DbContext`はスレッドセーフではありません。 この場合は`Transient`を使用する必要がありますか?なぜドキュメントは私**が** `Scoped` **を**使う**べき**であると示唆しているのですか? フレームワークの重要な部分を見逃すことはありますか?
回答: 他の人がすでに説明したように、あなたはそれが適切に再利用されますことを確認するために、データベースコンテキストのスコープの依存関係を使用する*必要があり*ます。並行処理の場合は、データベースを非同期に照会することもできるので、実際のスレッドは必要ない可能性があることに注意してください。 スレッド、つまりバックグラウンドワーカーが*必要な*場合は、リクエストとは生涯が異なる可能性があります。そのため、これらのスレッドは要求スコープから取得した依存関係を使用すべきではあり*ません* 。要求が終了し、その依存スコープがクローズされると、使い捨て依存関係が適切に処理されます。他のスレッドでは、依然として依存関係が必要になっても、依存関係が終了する可能性があります。 代わりに、作成するすべてのスレッドに対して新しい依存関係の有効範囲を明示的に開く必要があります。 `IServiceScopeFactory`を注入し、 `CreateScope`を使用してスコープを作成することで、これを行うことができます。結果のオブジェクトには、依存関係を取得できるサービスプロバイダが含まれます。これは別のスコープであるため、このスコープの存続期間中にデータベースコンテキストなどのスコープ依存性が再作成されます。 サービス・ロケータ・パターンに入るのを避けるために、スレッドが実行する1つの中央サービスを持つことを考慮して、必要なすべての依存関係をまとめて考慮する必要があります。スレッドはこれを行うことができます: ``` using (var scope = _scopeFactory.CreateScope()) { var service = scope.ServiceProvider.GetService(); service.Run(); } ``` `BackgroundThreadService`とそのすべての依存関係は、依存関係を受け取る共通の依存関係注入方法に従うことができます。