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