0

我目前正在构建一个 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(),但这导致我的服务使用不同版本的上下文,因此我的更改永远不会保存。

这似乎是一个很常见的场景——所以很高兴听到其他人的观点。

4

2 回答 2

2

您可以使用 Quartz.Net 作为调度机制,而不是创建休眠到下一次运行的线程。结合NamedScope 扩展,您将拥有与WebServiceInCallScope相同的行为。InRequestScope此外,您可以获得更优越的调度,而不仅仅是生成间隔运行的线程。您可以使用 Cron Job 语法指定它们何时运行。

看:

于 2013-09-06T23:14:38.540 回答
0

我特别喜欢@Remo 的建议,并将在我从事的下一个项目中尝试这些建议。但是,我最终通过使用自定义 InScope 实现解决了这个问题 - 但设置了一个自定义对象,每次线程运行时都应该有范围。这样,每次运行时都会重新创建上下文(在释放范围对象后就释放)。

于 2013-09-08T16:03:09.523 回答