2011-05-04 4 views
5

일정 기간 후에 인스턴스가 만료되는 전역 적으로 범위가 지정된 싱글 톤 객체에 대한 바인딩을 만들려면 어떻게해야합니까? 개체가 만료되면 해당 인스턴스가 만료 될 때까지 나는 ... 등, 새로운 인스턴스를 제공하기 위해 Ninject에 싶습니다만료되는 싱글 톤 바인딩은 어떻게 만듭니 까?

의사를 통해 아이디어를 얻을 바인딩 : 내가 찾는 게 아니에요

Bind<Foo>().ToSelf() 
    .InSingletonScope() 
    .WithExpiration(someTimeSpan); 

을 그 정확한 구문이 아니라 오히려 원하는 결과로 끝나는 방법. 본질적으로 Ninject를 슬라이딩 앱 캐시로 사용하는 것과 같습니다.

업데이트 이안이 제안한 방법론은 정확했습니다. 컨텍스트 키로 DateTime을 사용하는 것이 어떤 이유로 작동하지 않았기 때문에 약간 수정해야했습니다. 다음은 내가 끝까지 본 것입니다 :

var someTimeInFuture = DateTime.Now.AddSeconds(10); 
var fooScopeObject = new object(); 

Func<IContext, object> scopeCall = ctx => 
{ 
    if (someTimeInFuture < DateTime.Now) 
    { 
     someTimeInFuture = DateTime.Now.AddSeconds(10); 
     fooScopeObject = new object(); 
    } 

    return fooScopeObject; 
}; 


Kernel.Bind<Foo>() 
    .ToSelf() 
    .InScope(scopeCall); 
+0

당신은 일반적으로 서비스를 캐시하지 않으려는 것에서 명명 된 범위를 확장이지만, 데이터는 이러한 서비스를 관리 할 수 ​​있습니다. 그런데 왜 실제로 이것을하고 싶습니까? – Steven

+1

나는 당신이 말하는 것을 완전히 이해합니다. 이것은 어떤 중요한 아키텍처 변경도하지 않고 brownfield 앱에서 값싼 캐싱을 얻는 데 사용되었습니다 ... 우리는 아키텍처를 변경하지 않고 몇 가지 문제 점에서 성능을 향상시키기위한 목적으로 안티 패턴을 사용했음을 의미합니다. –

+0

설명해 주셔서 감사합니다. 그게 합당한 이유 같아. 결국 (소프트웨어) 엔지니어링은 모두 절충안에 관한 것입니다. – Steven

답변

2

본질적으로 시간 범위를 정의하고 있습니다. 사용자 정의 범위 함수를 사용하여 바인딩하고 일정 기간 후에 null을 반환 할 수 있습니다.

var someTimeInFuture = DateTime.Now.AddMinutes(5); 
Func<IContext,object> scopeCall = ctx => DateTime.Now > someTimeInFuture ? null : someTimeInFuture; 
Kernel.Bind<Foo>().ToSelf().InScope(scopeCall); 

지금 테스트 할 수 없지만 작동 할 수 있습니다.

+0

Func 가 필요하다고 생각합니다. scopeCall = ctx => DateTime.Now> someTimeInFuture? null : someTimeInFuture; –

+0

감사합니다. Daniel. 결정된. –

+0

많은 감사! DateTime을 반환 할 때 범위 호출이 올바르게 작동하지 않았다는 점을 제외하고는 다소 정확했습니다. 구조체는 범위를 결정하는 데 작동해서는 안됩니다 (최선의 추측). –

2

InScope (Func 범위)를 사용할 수 있습니다. 설명서에 나와 같이

이 경우 바인딩이 제공 콜백에 의해 리턴 된 객체 만큼 재 표기 통해 활성화 나타냅니다 살아 남아있는 (즉, 없었다 가비지 수집).

시나리오를 처리하는 사용자 지정 범위를 구현해야합니다. 자신의 범위 지정을 구현하는 방법을 좋은 예는

https://github.com/ninject/ninject.extensions.namedscope

관련 문제