5

Davam oIoC kullandığımda nesne atmayı nasıl yönetirim?

// normal explicit dispose 
using (var dc = new EFContext) 
{ 
} 

Ninject 2'dir Ama bazen veya işlev çağrılar arasında uzun bağlamı tutmak gerekir. Bu yüzden bu davranışı IoC kapsamında kontrol etmek istiyorum. Eğer IContext arabirimi üzerinde kontrol varsa

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

Numune

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

Yinelenen: http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc bağlantı – TrueWill

+0

teşekkürler. Yukarıdaki durumda kapsamımı singleton olarak değiştirirsem ne olur? Atıyor. Doğru, bir dahaki sefere bu fonksiyonu çağırırım, istisna alırsınız. – Aval

cevap

3

Ninject hiç yaşam döngüsü yönetimini desteklemeyen (Ben yaklaşık bir ay önce bir araştırma yaptım). Castle Windsor ve AutoFac (ve bir dereceye kadar StructureMap, ancak sadece iç içe konteynerler kullanıldığında) uygun zamanda oluşturdukları atılabilir bileşenleri bertaraf ederler.

1

kapsamları, devralır hangi arayüzleri listesine IDisposable ekleyin. Değilse,

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

using ((IDisposable)context) 
{ 
} 

Eğer IContext kontrol durumunda da, kompozisyon ederek bunu IContext arayüzünü değiştirerek seçeneğine sahip ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

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

using (context.GetUsageHandle()) 
{ 
} 
... IContext bir IDisposal olsun downcast bildiğim kadarıyla
+0

teşekkür için – Aval

+0

@Aval: bağlam tek kullanımlık olduğundan _not_ bir Singleton bir şey üretir ikinci uygulamasını kullanmak isteyeyim neden Sağ. Daha da iyisi, ikinci uygulamanın sadece tek kullanımlık nesneyi iade etmesi ve ardından müşteriyi etkilemeden tek kullanımlık sinekliklere sahip bir tekilliğe sahip olmasıyla başlayabilirsiniz. –

+0

teşekkürler, gerçekten bana yardımcı oldu. – Aval

1

Geçici, OnePerThread ve Singleton standart kapsamlarına ek olarak, nesne bir bütün dizi kullanım kontrol etmek amacıyla, bir ActivationBlock kullanabilir. Blok atıldığında, blok tarafından alınan tüm nesneler kapsam dışına çıkar - böylece, singletonlar ve diğerleri, örnekleri aktivasyon bloğu tarafından talep edildiğinde imha edilir.

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