我目前正在构建一个 Windows 服务,它创建一个每 30 分钟运行一次的线程,并更新一些符合条件的实体上的一些字段(将来,我想添加更多线程来做其他事情,例如运行一个24 小时、每周一次等)。该服务将使用已被 Web 应用程序使用并使用 Ninject(连同 DbContext)注入的服务来获取和更新其数据 - 这一切都可以使用 InRequestScope() 绑定正常工作。
但是,我一直在考虑如何最好地使用 Windows 服务来解决这个问题。本质上,一旦服务启动并创建线程,它就会连续运行(除了每 30 分钟休眠一次)——并且只有在 Windows 服务停止或进程终止时才会停止。我最初的想法是使用 Ninject 的 InThreadScope() 选项注入我的 DbContext 和服务 - 所以我将为每个线程提供一个 DbContext。但是,拥有如此长的生命周期的 DbContext 通常是一种好习惯吗?这个 DbContext 可能会在那里放置数周而不会被丢弃 - 我偷偷怀疑这不是一个好主意(内存泄漏等)。
但如果不是,那么处理这种情况的最佳方法是什么。每次线程运行时我都可以创建一个新的 DbContext,但是我将如何设置 Ninject 绑定?目前它们被定义为:
Bind<IDbContext>().To<EnterpriseDbContext>().InThreadScope();
Bind<IUserRepository>().To<UserRepository>().InThreadScope();
// Etc
所以我不完全确定我将如何构造它以在线程中创建一个新的。我查看了 InTransientScope(),但这导致我的服务使用不同版本的上下文,因此我的更改永远不会保存。
这似乎是一个很常见的场景——所以很高兴听到其他人的观点。