1. ホーム
  2. c#

ASP.NET Core 2.0 にアップグレードすると、シングルトン IActiveUsersService からスコープ付きサービス IMongoDbContext を消費できない。

2023-08-19 16:35:44

質問

今日、あるプロジェクトをASP.NET Core 2にアップデートしたところ、以下のエラーが発生しました。

シングルトンIActiveUsersServiceからスコープされたサービスIMongoDbContextを消費することができません。

以下のような登録をしています。

services.AddSingleton<IActiveUsersService, ActiveUsersService>();
services.AddScoped<IMongoDbContext, MongoDbContext>();
services.AddSingleton(option =>
{
   var client = new MongoClient(MongoConnectionString.Settings);
   return client.GetDatabase(MongoConnectionString.Database);
})



public class MongoDbContext : IMongoDbContext
{
   private readonly IMongoDatabase _database;

   public MongoDbContext(IMongoDatabase database)
   {
      _database = database;
   }

   public IMongoCollection<T> GetCollection<T>() where T : Entity, new()
   {
      return _database.GetCollection<T>(new T().CollectionName);
   }
}

public class IActiveUsersService: ActiveUsersService
{

   public IActiveUsersService(IMongoDbContext mongoDbContext)
   {
      ...
   }
}

DI がサービスを消費できないのはなぜですか?ASP.NET Core 1.1ではすべて正常に動作しています。

どのように解決するのですか?

ライフタイムが小さいサービスを使うことはできません。Scopedサービスはリクエストごとにしか存在しませんが、Singletonサービスは一度作成されればインスタンスは共有されます。

これで、1つのインスタンスだけが IActiveUsersService はアプリ内に1つだけ存在します。しかし、それは MongoDbContext に依存したいのですが、これは Scoped であり、リクエストごとに作成されます。

のどちらかにする必要があります。

  1. 作る MongoDbContext をシングルトンにする、または
  2. 作る IActiveUsersService スコープ付き、または
  3. パス MongoDbContext を関数の引数としてユーザサービスに渡す