Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Dependency injection 使用IoC时如何管理对象处理?_Dependency Injection_Inversion Of Control_Ioc Container_Ninject - Fatal编程技术网

Dependency injection 使用IoC时如何管理对象处理?

Dependency injection 使用IoC时如何管理对象处理?,dependency-injection,inversion-of-control,ioc-container,ninject,Dependency Injection,Inversion Of Control,Ioc Container,Ninject,我的情况是Ninject 2 // normal explicit dispose using (var dc = new EFContext) { } 但有时我需要将上下文保持更长时间或在函数调用之间。 所以我想通过IoC范围来控制这种行为 // if i use this way. how do i make sure object is disposed. var dc = ninject.Get<IContext>() // i cannot use this sin

我的情况是Ninject 2

// normal explicit dispose
using (var dc = new EFContext) 
{
}
但有时我需要将上下文保持更长时间或在函数调用之间。 所以我想通过IoC范围来控制这种行为

// if i use this way. how do i make sure object is disposed.
var dc = ninject.Get<IContext>() 

// i cannot use this since the scope can change to singleton. right ??
using (var dc = ninject.Get<IContext>()) 
{
}
//如果我用这种方式。如何确保对象已被处置。
var dc=ninject.Get()
//我不能使用它,因为范围可以更改为singleton。正确的??
使用(var dc=ninject.Get())
{
}
样本范围

Container.Bind<IContext>().To<EFContext>().InSingletonScope();
// OR
Container.Bind<IContext>().To<EFContext>().InRequestScope();
Container.Bind().To().InSingletonScope();
//或
Container.Bind().To().InRequestScope();

如果您可以控制
IContext
的接口,请将
IDisposable
添加到其继承的接口列表中。如果没有,向下播放
IContext
您将获得一个IDisposable

var context = ninject.Get<IContext>();

using ((IDisposable)context)
{
}

据我所知(大约一个月前我做了一项研究),Ninject根本不支持生命周期管理。Castle Windsor和AutoFac(以及某种程度上的StructureMap,但仅在使用嵌套容器时)将负责在适当的时间处理它们创建的一次性组件。

除了瞬态、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();

谢谢。在上述情况下,如果我将作用域更改为singleton呢?它可以处理。好的,下次我调用该函数时,会出现异常。@Aval:好的,这就是为什么要使用第二个实现,其中上下文生成的不是一次性的单例。更好的是,您可以从第二个实现开始,只返回一次性对象,然后更改为在不影响客户端的情况下使用具有一次性Flyweight的singleton。重复:
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();