【发布时间】:2010-12-23 13:24:55
【问题描述】:
我有一个 Windows 服务,其中包含一个文件观察程序,当文件到达时会引发事件。当一个事件被引发时,我将使用 Ninject 创建业务层对象,这些对象在它们内部具有对实体框架上下文的引用,该上下文也通过 Ninject 注入。在我的 Web 应用程序中,我总是使用 InRequestScope 作为上下文,这样在一个请求中,所有业务层对象都使用相同的实体框架上下文。在我当前的 Windows 服务场景中,将 Entity Framework 上下文绑定切换到 InThreadScope 绑定就足够了吗?
理论上,当服务中的事件处理程序触发时,它会在某个线程下执行,那么如果另一个文件同时到达,它将在另一个线程下执行。因此这两个事件不会共享一个实体框架上下文,本质上就像网络上的两个不同的 http 请求。
当您查看 Ninject wiki 时,困扰我的一件事是这些线程范围对象的破坏:
.InThreadScope() - 每个线程将创建一个该类型的实例。.InRequestScope() - 每个 Web 请求将创建一个该类型的实例,并在请求结束时销毁。
基于此,我了解 InRequestScope 对象将在请求结束时(或之后的某个时间点)被销毁(垃圾收集?)。然而,这并没有说明 InThreadScope 对象是如何被销毁的。回到我的示例,当文件观察程序事件处理程序方法完成时,线程消失(回到线程池?)注入的 InThreadScope-d 对象会发生什么?
编辑: 现在有一点很清楚,当使用 InThreadScope() 时,当文件观察程序的处理程序退出时,它不会破坏您的对象。我能够通过在文件夹中删除许多文件来重现这一点,最终我得到了相同的线程 id,这导致了与以前完全相同的实体框架上下文,所以这对于我的应用程序来说绝对是不够的。在这种情况下,5 分钟后进入的文件可能正在使用之前分配给同一线程的陈旧上下文。
【问题讨论】:
标签: c# .net asp.net ninject ninject-2