修复EF4.1上下文+ Ninject组合的内存泄漏

时间:2013-11-15 15:52:20

标签: entity-framework memory-leaks ninject named-scope ninject-conventions

我有一个Windows服务,使用NCron定期运行一些作业。我最近介绍了Ninject,并且由于EF上下文(来自EF4.1的ObjectContext)不是GC(我记忆中描述它),因此得到了一些严重的内存问题。

值得一提的是,其中一些工作运行时间很长(10-15分钟)并且数据库密集。我知道EF可能不是这种工作的最佳解决方案,但是现在重构是不可能的。

我在这个主题上找到了相当多的材料,所以我继续:

  1. 在我的工作班中实施INotifyWhenDisposed
  2. 尝试在命名范围内定义EF上下文绑定,希望在作业完成后它能够正确处理和GC'
  3. 我似乎无法让第二个工作,我得到一个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)
    
    为了简洁起见,我为了简洁而裁掉了休息。

    我做错了什么?

    UPDATE 1 - 构造函数注入工作,当我明确.Get<T>时发生异常。

0 个答案:

没有答案