Подтвердить что ты не робот

Удаление Ninject и DataContext

Я использую Ninject для извлечения моего DataContext из ядра, и мне было интересно, будет ли Ninject автоматически располагать DataContext или как он обрабатывает поведение dispose(). Из собственного опыта я знаю, что утилизация datacontext довольно важна и что всякий раз, когда вы создаете прямой объект DataContext (как в: new DataContext()), вы должны использовать блок using().

Мой вопрос таким образом: Когда я получаю свой DataContext из ядра, должен ли я использовать блок using()? Или Ninject исправить это для меня?

4b9b3361

Ответ 1

Я расследую это для моего коллеги Баса. Я искал исходный код Ninject 2 (http://github.com/ninject/ninject.git), и, похоже, существует некоторое управление жизненным циклом.

Если есть другая область действия, чем переходная, то сбор мусора этой области вызовет деактивацию (через конвейер) всех экземпляров, связанных с этой областью. При деактивации одной из стратегий по умолчанию является DisposableStrategy, эта стратегия будет удалять экземпляр, если он IDisposable!

Я видел много ответов на stackoveflow, что Ninject не выполняет никакого управления жизненным циклом, возможно, это было верно для предыдущей версии Ninject?

Но это поведение довольно сложно, так как при использовании инъецируемых служб вы не знаете об объеме. Из-за этого вы не знаете, нужно ли вам самому распоряжаться объектом (временным) или что Ninject позаботится об этом.

Изменения в сфере обслуживания могут привести к появлению ошибок.

Ответ 2

В дополнение к стандартным областям Transient, OnePerThread и Singleton вы можете использовать ActivationBlock для управления временем жизни всего набора объектов. Когда блок размещен, весь объект, извлеченный блоком, выходит из области видимости - поэтому одиночные и другие объекты удаляются, когда их экземпляры запрашиваются блоком активации.

var kernel = new StandardKernel();
kernel.Bind<NotifiesWhenDisposed>().ToSelf();

NotifiesWhenDisposed instance = null;
using(var block = new ActivationBlock(kernel))
{
    instance = block.Get<NotifiesWhenDisposed>();
    instance.IsDisposed.ShouldBeFalse();
}

instance.IsDisposed.ShouldBeTrue();

Ответ 3

Не похоже, что у ninject есть какое-то управление жизненным циклом. Этот вопрос проливает больше света на него.

Возможно, вы можете исследовать реализацию своего собственного поведения, как показано в в этом блоге. Я не пробовал, но, может быть, вы можете сделать что-то по строкам каждого запроса singleton, при этом старый экземпляр будет удален, когда будет создан новый.