Bas*_*Bas 22 c# datacontext dispose ninject ioc-container
我正在使用Ninject从内核中检索我的DataContext,我想知道Ninject是否自动处理DataContext,或者他如何处理dispose()行为.根据自己的经验,我知道处理datacontext非常重要,每当你创建DataContext的直接对象时(如:new DataContext()),你应该使用using()块.
我的问题是:当我从内核中检索我的DataContext时,我是否仍然必须使用using()块?或者Ninject是否为我解决了这个问题?
JJo*_*oos 16
我正在为我的同事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<NotifiesWhenDisposed>().ToSelf();
NotifiesWhenDisposed instance = null;
using(var block = new ActivationBlock(kernel))
{
instance = block.Get<NotifiesWhenDisposed>();
instance.IsDisposed.ShouldBeFalse();
}
instance.IsDisposed.ShouldBeTrue();
Run Code Online (Sandbox Code Playgroud)