5

moim przypadku jest to Ninject 2.Jak zarządzać usuwaniem obiektów podczas korzystania z IoC?

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

Ale czasami trzeba zachować kontekst dłużej lub między wywołań funkcji. Więc chcę kontrolować to zachowanie poprzez zakres 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>()) 
{ 
} 

Próbka celownicze

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

Duplikat: http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc – TrueWill

+0

Dzięki za link – Aval

Odpowiedz

3

Z tego, co wiem (przeprowadziłem badania około miesiąca temu), firma Ninject w ogóle nie wspiera zarządzania cyklem życia. Castle Windsor i AutoFac (i do pewnego stopnia StructureMap, ale tylko przy użyciu zagnieżdżonych kontenerów) zajmą się wyrzucaniem jednorazowych komponentów, które tworzą w odpowiednim czasie.

1

Jeśli masz kontrolę nad interfejsem IContext, dodać IDisposable do listy interfejsów, z której dziedziczy. Jeśli nie, przygnębiony IContext dostać do IDisposable ...

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

using ((IDisposable)context) 
{ 
} 

Masz również możliwość zmiany interfejsu IContext to zrobić na podstawie składu, jeśli kontrolujesz IContext ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

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

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

dzięki. co jeśli zmienię swój zakres na singleton w powyższej sprawie? Likwiduje. w prawo, następnym razem, gdy zadzwonię do tej funkcji, otrzymasz wyjątek. – Aval

+0

@Aval: Właśnie, dlatego chciałbyś skorzystać z drugiej implementacji, w której kontekst tworzy coś, co nie jest jednorazowym singletonem. Co więcej, możesz zacząć od tego, że druga implementacja po prostu zwróci obiekt jednorazowy, a następnie zmieni się w singleton z jednorazowymi pojemnikami na muchy bez wpływu na klienta. –

+0

dzięki, naprawdę mi pomogło. – Aval

1

Oprócz standardowych zakresów Transient, OnePerThread i Singleton, można użyć ActivationBlock, aby kontrolować czas życia całego zestawu obiektów. Gdy blok zostanie usunięty, wszystkie obiekty wyszukane przez blok wykraczają poza zakres - tak pojedyncze i inne są usuwane, gdy ich wystąpienia są wymagane przez blok aktywacyjny.

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(); 
Powiązane problemy