Я использую Ninject для получения моего DataContext от ядра, и я задавался вопросом, располагает ли Ninject автоматически DataContext, или как он обрабатывает расположение () поведение. На основе собственных событий я знаю, что расположение datacontext довольно важно и это каждый раз, когда Вы создаете прямое дополнение DataContext (как в: новый DataContext ()), необходимо использовать использование () блок.
Мой вопрос таким образом: Когда я получаю свой DataContext от ядра, мне придется все еще использовать использование () блок? Или Ninject фиксирует это для меня?
Я расследуя это для моего коллеги Баса. Я искал исходный код Ninject 2 ( http://github.com/ninject/ninject.git ), и, похоже, там есть какое-то управление жизненным циклом.
Когда есть другая область видимости, кроме временной, тогда сборка мусора этой области будет запускать деактивацию (через конвейер) всех экземпляров, связанных с этой областью. При деактивации одной из стратегий по умолчанию является DisposableStrategy, эта стратегия удалит экземпляр, если он IDisposable!
Я видел много ответов на stackoveflow о том, что Ninject не управляет жизненным циклом, может быть, это было верно для предыдущей версии Ninject?
Но такое поведение довольно сложно, поскольку при использовании внедренных сервисов вы не осведомлен о масштабах. Из-за этого вы не знаете, нужно ли вам избавляться от объекта самостоятельно (временный) или что Ninject позаботится об этом.
Таким образом, изменение объема службы может привести к ошибкам.
В дополнение к стандартным областям действия 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();
Не похоже, что у ninject есть какое-то управление временем жизни. Этот вопрос проливает больше света на это.
Возможно, вы можете попробовать реализовать собственное поведение, как показано в этом блоге. Я не пробовал, но, возможно, вы сможете сделать что-то вроде синглтона для каждого запроса с утилизацией старого экземпляра при создании нового.