.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 컨테이너와 함께가는 길입니다 : 단위 테스트를 제대로했는지 여부를 단위 테스트하지 않고 통합 및 시스템 테스트로 테스트합니다.
일회용 의존성을 가진 클래스 자체가'InRequestScope()'에 바인딩되어 일회성 의존성이 한 요청보다 더 오래 지속되는 것을 피하고 싶었습니다. 예를 들어'InSingletonScope()'바인딩을 가진 타입이'InRequestScope()'바인딩을 가진 의존성을 가지고있을 때,이 의존성은 실제로 요청의 끝에서 (클래스 이 의존성이 살아있는 것). 개발자가 예기치 않은 동작을하는 것을 잊지 않도록 테스트를 작성하려고했습니다. 다른 방법이 있다면 알려주세요. – bump
@bump 당신은 [종속 종속성] (http://blog.ploeh.dk/2014/06/02/captive-dependency/)을 찾고 있습니다. [Castle] (http://docs.castleproject.org/Windsor.MainPage.ashx) 및 [Simple Injector] (https://simpleinjector.org)에는 모두 검색 메커니즘이 내장되어 있습니다. – qujck
예 @qujck가 맞습니다. 그것이 당신에게 정말로 중요하다면 나는 그가 언급 한 프레임 워크 중 하나로 전환하거나 따라 잡아 당기는 요청을 만들 것입니다. 슬프게도 충분히 Ninject 끌어 오기 요청은 통과/받아 들일 수있는 매우 긴 시간이 걸릴 것이라고 생각합니다. – BatteryBackupUnit