5

我的情况下,它是Ninject 2我在使用IoC时如何管理对象处理?

// 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>()) 
{ 
} 

样品作用域

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

重复:http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc – TrueWill 2010-04-09 21:14:15

+0

感谢您的链接 – Aval 2010-04-09 21:48:37

回答

3

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

1

如果你有超过IContext接口控制,加IDisposable到它所继承的接口列表。如果没有,垂头丧气的IContext你到了IDisposable ...

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

using ((IDisposable)context) 
{ 
} 

你也有改变的IContext接口的选项,通过组成做到这一点,如果你控制IContext ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

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

using (context.GetUsageHandle()) 
{ 
} 
+0

感谢。如果我在上述情况下将范围更改为单身人士,该怎么办?它处置。对,下一次我打电话给那个功能,你会得到异常。 – Aval 2010-04-09 19:51:25

+0

@Aval:正确,这就是为什么你想要使用第二个实现,上下文产生的东西不是一次性的Singleton。更好的是,您可以通过让第二个实现只返回一次性对象,然后改变为拥有一次性flyweights的singleton而不影响客户端来开始。 – 2010-04-10 00:42:00

+0

谢谢,它真的帮了我。 – Aval 2010-04-14 18:36:19

1

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