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

Sample прицелы

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

+0

Спасибо за ссылку – Aval

ответ

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

спасибо. что, если я изменю свою область действия на singleton в приведенном выше случае? Он распоряжается. right, В следующий раз, когда я вызову эту функцию, вы получите исключение. – Aval

+0

@Aval: Правильно, поэтому вы хотели бы использовать вторую реализацию, где контекст создает нечто, что является _not_ a Singleton, который является одноразовым. Лучше, тем не менее, вы можете начать с того, что вторая реализация просто вернет одноразовый объект, а затем изменится на одноэлемент с одноразовыми мухоловками без воздействия на клиента. – 2010-04-10 00:42:00

+0

спасибо, это действительно помогло мне. – Aval

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(); 
Смежные вопросы