0

我有一个 Windows 服务,它使用 NCron 定期运行一些作业。我最近介绍了 Ninject 并遇到了一些严重的内存问题,因为 EF 上下文(来自 EF4.1 的 ObjectContext)没有经过 GC(我对其进行了内存分析)。

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

我找到了很多关于这个主题的材料,所以我继续:

  1. 在我的工作课程中实施 INotifyWhenDisposed
  2. 尝试在命名范围内定义 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>表示异常发生时。

4

0 回答 0