Удаление Ninject и DataContext - PullRequest
       22

Удаление Ninject и DataContext

22 голосов
/ 03 июня 2010

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

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

Ответы [ 3 ]

16 голосов
/ 03 июня 2010

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

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

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

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

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

5 голосов
/ 03 июня 2010

В дополнение к стандартным областям действия 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();
0 голосов
/ 03 июня 2010

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

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

...