Исправление утечки памяти в контексте EF4.1 + комбо Ninject
У меня есть служба Windows, которая периодически запускает некоторые задания с помощью NCron. Недавно я представил Ninject и получил некоторые серьезные проблемы с памятью из-за того факта, что контекст EF (ObjectContext из EF4.1) не GC-кодирован (я профилировал его в памяти).
Возможно, стоит упомянуть, что некоторые из этих заданий довольно продолжительны (10-15 минут) и интенсивно работают с базами данных. Я знаю, что EF, вероятно, не лучшее решение для такого рода работы, но это невозможно реорганизовать на данном этапе.
Я нашел довольно много материала на эту тему, поэтому я продолжил:
- Реализация INotifyWhenDisposed в моих классах работы
- Попытка определить привязку контекста 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>
что исключение происходит.