現在、Entity Framework (DbContext) を使用して既存のサービス レイヤーに接続する Windows サービスを作成しており、Ninject を使用して Respositories と DbContext インスタンスを注入しています。これは、スレッドが実行されるたびに新しい DbContext インスタンスが必要ですが、現時点では、スレッドの存続期間全体で同じインスタンスを取得しています。
私のバインディングは次のようになります。
Bind<IDbContext>().To<EnterpriseDbContext>().InThreadScope();
Bind<IUserRepository>().To<UserRepository>().InThreadScope();
// And other repositories
そして、私のスレッドコードは次のようになります:
[Inject]
public IDbContext DbContext { get; set; }
// Execute indefinitely (or until we've stopped)
while (true && !isStopping)
{
try
{
// Do work.
// Save any changes.
DbContext.SaveAnyChanges();
}
catch (Exception ex)
{
// Handle exception
HandleException(ex);
}
// Sleep
Thread.Sleep(sleepInterval);
}
これで、スコープを InTransientScope() などに変更できることがわかりましたが、Ninject にはまだ慣れていないので、毎回新しい DbContext インスタンスを使用するようにコードを整理する方法がよくわかりません。
誰かが似たようなことをしたことがありますか?Web アプリには、完全に機能する InRequestScope() がありますが、Windows サービスで DbContext を使用する方法については、ここでの最善のアプローチがよくわかりません。