Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject和DataContext处理_C#_Ioc Container_Datacontext_Dispose_Ninject - Fatal编程技术网

C# Ninject和DataContext处理

C# Ninject和DataContext处理,c#,ioc-container,datacontext,dispose,ninject,C#,Ioc Container,Datacontext,Dispose,Ninject,我正在使用Ninject从内核检索我的DataContext,我想知道Ninject是否会自动处理DataContext,或者他如何处理dispose()行为。根据自己的经验,我知道处理datacontext非常重要,无论何时创建datacontext的直接对象(如:newDataContext()),都应该使用using()块 因此,我的问题是:当我从内核检索我的DataContext时,我还需要使用using()块吗?或者Ninject会帮我解决这个问题吗?看起来Ninject没有任何类型的

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


因此,我的问题是:当我从内核检索我的DataContext时,我还需要使用using()块吗?或者Ninject会帮我解决这个问题吗?

看起来Ninject没有任何类型的生命周期管理。这更能说明问题


也许您可以研究实现您自己的行为,如中所示。我还没有尝试过,但也许你可以在创建新实例时处理旧实例,按照每请求单例来做一些事情。

我正在为我的同事Bas调查这一点。我在查看Ninject 2源代码(),其中似乎有一些生命周期管理

当存在非瞬态范围时,该范围的垃圾收集将触发(通过管道)所有链接到该范围的实例的停用。在停用时,默认策略之一是DisposableStrategy,如果实例是IDisposable的,则此策略将对其进行处置

我在stackoveflow上看到了很多答案,Ninject不做任何生命周期管理,也许以前版本的Ninject也是这样

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


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

除了瞬态、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();
var-kernel=new-StandardKernel();
kernel.Bind().ToSelf();
Notifiedswhendisposed实例=null;
使用(var块=新激活块(内核))
{
instance=block.Get();
instance.IsDisposed.ShouldBeFalse();
}
instance.IsDisposed.ShouldBeTrue();

我想这是Nate在这里描述的:]在这次讨论中,ninject的制造商自己解释了ninject是如何处理生命周期管理的:通过web archive链接到Nate的帖子:我没有这个功能,为什么不使用一个带有内核的using块。get()?使用激活块的好处是什么?因为从该块检索的所有实例都超出范围。在这个示例中,我只显示了一个检索到的实例。从块中检索到的任何单例都将解析为单例。对于其他生活方式也是如此。考虑场景:Boo.GET();类A需要构造函数中的B实例,ninject也会创建该实例。使用ActivationBlock,A的实例和B的实例都被清理了