Исправление утечки памяти в контексте EF4.1 + комбо Ninject

У меня есть служба Windows, которая периодически запускает некоторые задания с помощью NCron. Недавно я представил Ninject и получил некоторые серьезные проблемы с памятью из-за того факта, что контекст EF (ObjectContext из EF4.1) не GC-кодирован (я профилировал его в памяти).

Возможно, стоит упомянуть, что некоторые из этих заданий довольно продолжительны (10-15 минут) и интенсивно работают с базами данных. Я знаю, что EF, вероятно, не лучшее решение для такого рода работы, но это невозможно реорганизовать на данном этапе.

Я нашел довольно много материала на эту тему, поэтому я продолжил:

  1. Реализация INotifyWhenDisposed в моих классах работы
  2. Попытка определить привязку контекста EF в именованной области, надеясь, что она будет удалена и GC'а правильно, когда работа будет завершена

Я не могу заставить работать 2-й, я получаю исключение 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> что исключение происходит.

0 ответов

Другие вопросы по тегам