5

내 경우는IoC를 사용할 때 개체 처리를 어떻게 관리합니까?

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

Ninject에 2입니다하지만 가끔은 내가 또는 함수 호출 사이에 더 이상 상황을 유지해야합니다. 그래서 IoC 범위를 통해이 동작을 제어하려고합니다. 당신이 IContext의 인터페이스를 통해 제어 할 수있는 경우

// 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

+0

감사합니다. 위의 경우 싱글 톤으로 범위를 변경하면 어떻게됩니까? 처분. 맞아, 다음 번에 그 함수를 호출하면 예외가 생깁니다. – Aval

답변

3

Ninject는 수명주기 관리를 전혀 지원하지 않습니다 (한 달 전에 조사했습니다). Castle Windsor와 AutoFac (그리고 어느 정도까지는 StructureMap,하지만 중첩 된 컨테이너를 사용할 때만) 적절한 시간에 생성되는 일회용 구성 요소를 폐기 처리합니다.

1

스코프, 그것은 상속받는 인터페이스 목록에 IDisposable를 추가합니다. 그렇지 않은 경우,

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

using ((IDisposable)context) 
{ 
} 

당신이 IContext를 제어하는 ​​경우 또한, 조성이 작업을 수행하는 IContext의 인터페이스를 변경하는 옵션이 있습니다 ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

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

using (context.GetUsageHandle()) 
{ 
} 
... (가) IContext 당신이는 IDisposable에 도착 내리 뜬
+0

감사에 대한 – Aval

+0

@Aval : 그렇기 때문에 두 번째 구현을 사용하려는 이유가 있습니다. 컨텍스트가 일회용이 아닌 단일 함수를 생성하는 곳입니다. 두 번째 구현에서 일회용 객체를 반환하고 클라이언트에 영향을주지 않으면 서 일회용 플라이 웨이트가있는 싱글 톤으로 변경하는 것으로 시작할 수 있습니다. –

+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(); 
관련 문제