Ninject и распоряжение DataContext

Я использую Ninject для получения моего DataContext от ядра, и я задавался вопросом, располагает ли Ninject автоматически DataContext, или как он обрабатывает расположение () поведение. На основе собственных событий я знаю, что расположение datacontext довольно важно и это каждый раз, когда Вы создаете прямое дополнение DataContext (как в: новый DataContext ()), необходимо использовать использование () блок.

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

22
задан Bas 3 June 2010 в 09:30
поделиться

3 ответа

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

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

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

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

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

16
ответ дан 29 November 2019 в 05:40
поделиться

В дополнение к стандартным областям действия 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();
5
ответ дан 29 November 2019 в 05:40
поделиться

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

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

0
ответ дан 29 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: