我是 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;
}
Calling GetInstance<SimplePOCO>()
错误并显示以下消息:
SimplePOCO 类型的注册委托引发了异常。这
SimplePOCO 被注册为“Web API 请求”生活方式,但是
实例是在 Web API 请求上下文之外请求的。
难道我做错了什么?消息处理程序是否在 WebAPI 请求的生命周期之外?考虑到它们的整体性,这似乎很奇怪。如果消息处理程序在生命周期之外,是否存在包含消息处理程序的更长生命周期?
消息处理程序是否在 WebAPI 请求的生命周期之外?
嗯,事实上,他们确实如此。除非你触发了创建IDependencyScope
明确地,IDependencyScope
被创建(通过调用request.GetDependencyScope()
) 在 - 的里面DefaultHttpControllerActivator.Create
method.
为了确保您的代码在依赖范围内运行,您所要做的就是调用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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)