我正在使用Ninject从内核中检索我的DataContext,我想知道Ninject是否会自动处理DataContext,或者他是如何处理dispose()行为的。根据自己的经验,我知道处理datacontext非常重要,无论何时创建DataContext的直接对象(如:new DataContext()),都应该使用using()块。
我的问题是:当我从内核中检索我的DataContext时,我是否仍然需要使用using()块?或者Ninject是否为我解决了这个问题?
答案 0 :(得分:16)
我正在为我的同事Bas调查此事。我在查看Ninject 2源代码(http://github.com/ninject/ninject.git),似乎有一些生命周期管理。
当存在除瞬态之外的其他范围时,该范围的垃圾收集将触发链接到该范围的所有实例的停用(通过管道)。在停用时,默认策略之一是DisposableStrategy,如果它是IDisposable,该策略将处置该实例!
我在stackoveflow上看到了很多关于Ninject没有进行任何生命周期管理的答案,也许对于以前版本的Ninject来说这是真的吗?
但是这种行为非常棘手,因为在使用注入服务时,您不了解范围。因此你不知道你是否必须自己处理对象(瞬态)或者Ninject会处理这个问题。
对服务范围的更改可能会导致错误。
答案 1 :(得分:5)
除了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();
答案 2 :(得分:0)
看起来不像ninject有任何生命周期管理。 This question更多地阐明了它。
也许您可以调查实施自己的行为,如this blog中所示。我还没有尝试过,但也许你可以按照每个请求单行创建一些内容,并在创建新实例时处理旧实例。