質問: SoapCoreを使用して、ASP.NET Core MVCアプリケーション用のWebサービスを作成しています。 Entity Framework Coreとシンプルなリポジトリパターンを使用して、DBデータを取得しています。 `.AddSingleton()`を介してリポジトリクラスを注入しています。 ``` services.AddSingleton(); services.AddSingleton(); ``` EF `DbContext`がスコープされているため、Webサービスを呼び出すときにエラーが発生します。 > シングルトン「App._Repository.IImportRepository」からスコープサービス「App.Data.ApplicationDbContext」を使用できません。 > > 代わりに`.AddScoped()`を使用すると、 `.AddScoped()`に機能します。 **コントローラー/クラスコンストラクター**を介してスコープ付き依存関係を挿入するのは悪い習慣です。 シングルトンで動作させる別の方法があるのか、それとも長期にわたって主要な欠点がありますか(約100〜200人のユーザーがサイトを使用する)、コントローラーを介してコントローラーでスコープインジェクションを使用する場合
回答: 簡単に言えば、あなたの行く寿命は「スコープ」されるべきです。 *正当な*理由がある場合にのみ、シングルトンまたは一時的なライフタイムを使用する必要があります。シングルトンにとっては、ロックの管理や、アプリケーションの存続期間中持続する必要があるデータの保持などであり、どちらもリポジトリの概念には当てはまりません。リポジトリは完全に使い捨てである必要があります。重要なのは、データベースまたは他のストアに永続化することです。したがって、永続化する必要のある独自のデータをデータに含めることはできません。 長いことも短いことも、ここでの最善策は、単にレポのスコープを設定することです。そのため、コンテキストを直接注入できます。コンストラクターのインジェクションに関しては、それが悪いプラクティスであるという考えをどこから得たのかわかりません。実際、ほとんどの場合、依存性注入はどのように機能するかであるため、実際に依存関係の注入を行うことはできません。 シングルトンが*絶対に必要な*場合、唯一のオプションはサービスロケーターアンチパターンです。そのために、 `IServiceProvider`を注入します。 ``` public class MyRepo { private readonly IServiceProvider _serviceProvider; public MyRepo(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } ... } ``` 次に、 *コンテキストが必要*になる*たびに* (重要です)、次のことを行う必要があります。 ``` using (var scope = _serviceProvider.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService(); // do something with context } ```