我有一个 Windows 服务,它使用 NCron 定期运行一些作业。我最近介绍了 Ninject 并遇到了一些严重的内存问题,因为 EF 上下文(来自 EF4.1 的 ObjectContext)没有经过 GC(我对其进行了内存分析)。
值得一提的是,其中一些作业运行时间很长(10-15 分钟)并且是数据库密集型的。我知道 EF 可能不是此类工作的最佳解决方案,但目前无法重构。
我找到了很多关于这个主题的材料,所以我继续:
- 在我的工作课程中实施 INotifyWhenDisposed
- 尝试在命名范围内定义 EF 上下文绑定,希望在作业完成后能够正确处理和 GC
我似乎无法让第二个工作,我得到一个命名范围不存在的 ActivationException。
这是我在调试模式下尝试的一段简单代码,它复制了这一点:
const string Scope = "Scope";
kernel.Bind(c => c.FromThisAssembly()
.SelectAllClasses().InheritedFrom<MyCronJob>()
.BindToSelf()
.Configure(b => b.DefinesNamedScope(Scope)));
kernel.Bind<IMyContext>().To<MyContext>().InNamedScope(Scope);
kernel.Get<ProcessImportJob>().DoWork();
接着
internal class ProcessImportJob : MyCronJob
{
private readonly IMyContext _ctx;
public ProcessImportJob(IMyContext ctx)
为了简洁起见,我把剩下的剪掉了。
我究竟做错了什么?
更新 1 - 构造函数注入有效,当我明确.Get<T>
表示异常发生时。