2014-11-05 1 views
0

특정 Ninject 커널 인스턴스에서 인터페이스 유형에 대한 바인딩을 얻은 경우 바인딩 유형 (즉, InSingletonScope(), InRequestScope())을 확인할 수있는 방법이 있습니까?Ninject 바인딩이 InRequestScope인지 확인하십시오.

(간체) 예 :

IKernel kernel = NinjectWebCommon.CreateKernel(); 
var binding = kernel.GetBindings(typeof(IService)).FirstOrDefault(); 

var bindingType = binding...?? 

답변

1

.InRequestScope() 자체가 호출 IBindingSyntax.InScope(Func<IContext, object> scope);

ScopeCallback을 (Func<IContext, object> scope)를 검색 할 수 있습니다 :

kernel 
    .GetBindings(typeof(IService)) 
    .Single() 
    .ScopeCallback 

그러나 Func을 비교하는 것은 정말 좋은 것은 아니다 . 그것은 매우 hackish 느낀다 그러나 우리는 비교하기 위해 요청 범위 콜백을 검색하려면 다음을 수행 할 수 있습니다 지금

private Func<IContext, object> RetrieveInRequestScopeCallback() 
{ 
    using (var kernel = new StandardKernel()) 
    { 
     kernel.Bind<object>().ToSelf().InRequestScope(); 
     return kernel.GetBindings(typeof(object)).Single().ScopeCallback; 
    } 
} 

는 다음과 같은 단위 테스트는 통과 할 것이다 :
[Fact] 
public void Foo() 
{ 
    Func<IContext, object> inRequestScopeCallback = RetrieveInRequestScopeCallback(); 

    var kernel = new StandardKernel(); 
    kernel.Bind<string>().ToSelf().InRequestScope(); 

    IBinding binding = kernel.GetBindings(typeof(string)).Single(); 
    binding.ScopeCallback.Should().Be(inRequestScopeCallback); 
} 

은 (내가 FluentAssertions을 사용했습니다 xunit)

그러나 내가 말했듯이 이것은 hackish입니다. 왜 바인딩을 확인하고 싶습니까? 자동화 된 통합/시스템 테스트를 만드는 데 투자하는 것이 더 낫다는 것을 제안합니다. 그것은 일반적으로 DI 컨테이너와 함께가는 길입니다 : 단위 테스트를 제대로했는지 여부를 단위 테스트하지 않고 통합 및 시스템 테스트로 테스트합니다.

+0

일회용 의존성을 가진 클래스 자체가'InRequestScope()'에 바인딩되어 일회성 의존성이 한 요청보다 더 오래 지속되는 것을 피하고 싶었습니다. 예를 들어'InSingletonScope()'바인딩을 가진 타입이'InRequestScope()'바인딩을 가진 의존성을 가지고있을 때,이 의존성은 실제로 요청의 끝에서 (클래스 이 의존성이 살아있는 것). 개발자가 예기치 않은 동작을하는 것을 잊지 않도록 테스트를 작성하려고했습니다. 다른 방법이 있다면 알려주세요. – bump

+3

@bump 당신은 [종속 종속성] (http://blog.ploeh.dk/2014/06/02/captive-dependency/)을 찾고 있습니다. [Castle] (http://docs.castleproject.org/Windsor.MainPage.ashx) 및 [Simple Injector] (https://simpleinjector.org)에는 모두 검색 메커니즘이 내장되어 있습니다. – qujck

+1

예 @qujck가 맞습니다. 그것이 당신에게 정말로 중요하다면 나는 그가 언급 한 프레임 워크 중 하나로 전환하거나 따라 잡아 당기는 요청을 만들 것입니다. 슬프게도 충분히 Ninject 끌어 오기 요청은 통과/받아 들일 수있는 매우 긴 시간이 걸릴 것이라고 생각합니다. – BatteryBackupUnit

관련 문제