Ninject和DataContext处理

我正在使用Ninject从内核中检索我的DataContext,我想知道Ninject是否自动处理DataContext,或者他如何处理dispose()行为。 根据自己的经验,我知道处理datacontext非常重要,每当你创建DataContext的直接对象时(如:new DataContext()),你应该使用using()块。

我的问题是:当我从内核检索我的DataContext时,我是否仍然必须使用using()块? 或者Ninject是否为我解决了这个问题?

我正在为我的同事Bas调查此事。 我在查看Ninject 2源代码( http://github.com/ninject/ninject.git ),似乎有一些生命周期管理。

当存在除瞬态之外的其他范围时,该范围的垃圾收集将触发链接到该范围的所有实例的停用(通过管道)。 在停用时,其中一个默认策略是DisposableStrategy,如果它是IDisposable,该策略将处置该实例!

我在stackoveflow上看到了很多关于Ninject没有进行任何生命周期管理的答案,也许对于之前版本的Ninject来说这是真的吗?

但是这种行为非常棘手,因为在使用注入服务时,您不了解范围。 因此,你不知道你是否必须自己处理对象(瞬态)或者Ninject会处理这个问题。

因此,对服务范围的更改可能会引入错误。

除了Transient,OnePerThread和Singleton的标准范围之外,您还可以使用ActivationBlock来控制整个对象的生命周期。 当块被释放时,由块检索的所有对象都超出范围 – 因此当激活块请求它们的实例时,单个和其他对象被丢弃。

var kernel = new StandardKernel(); kernel.Bind().ToSelf(); NotifiesWhenDisposed instance = null; using(var block = new ActivationBlock(kernel)) { instance = block.Get(); instance.IsDisposed.ShouldBeFalse(); } instance.IsDisposed.ShouldBeTrue(); 

看起来不像ninject有任何生命周期管理。 这个问题对此有了更多启示。

也许您可以调查实现自己的行为,如本博客所示。 我没有尝试过,但是也许你可以按照每个请求单行创建一些东西,在创建新实例时处理旧实例。