我目前正在编写一个 Windows 服务,它使用实体框架(DbContext)连接到现有服务层,并使用 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 的最佳方法。