我是SimpleInjector的新手,并通过使用WebAPI的示例进行操作。我使用了SimpleInjector.Integration.WebApi.WebHost.QuickStart
nu-get包,然后为我的测试注册了一个简单类型,如下所示:
container.RegisterWebApiRequest<SimplePOCO>();
从ApiController方法内部,我可以请求一个实例。到现在为止还挺好。我想将我的测试扩展到早期的管道,特别是消息处理程序。所以我创建了一个简单的DelegatingHandler,如:
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken) {
Task<HttpResponseMessage> response;
var container = SimpleInjectorWebApiInitializer.container;
var rc = container.GetInstance<SimplePOCO>();
response = base.SendAsync(request, cancellationToken);
response.ContinueWith((responseMsg) => { });
return response;
}
使用以下消息调用GetInstance<SimplePOCO>()
错误:
SimplePOCO类型的已注册委托引发了异常。该 SimplePOCO注册为“Web API请求”生活方式,但是 在Web API请求的上下文之外请求实例。
我做错了吗?消息处理程序是否在WebAPI请求的生命周期之外?考虑到它们的完整性,这看起来很奇怪。如果消息处理程序在生命周期之外,那么包含消息处理程序的生命周期会更长吗?
答案 0 :(得分:7)
消息处理程序是否在WebAPI请求的生命周期之外?
嗯,事实上,他们是。除非您明确触发IDependencyScope
的创建,否则会在IDependencyScope
方法中创建request.GetDependencyScope()
(通过调用DefaultHttpControllerActivator.Create
)。
要确保您的代码在依赖范围内运行,您所要做的就是在处理程序中明确调用request.GetDependencyScope()
:
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken) {
// trigger the creation of the scope.
request.GetDependencyScope();
Task<HttpResponseMessage> response;
var container = SimpleInjectorWebApiInitializer.container;
var rc = container.GetInstance<SimplePOCO>();
response = base.SendAsync(request, cancellationToken);
response.ContinueWith((responseMsg) => { });
return response;
}