C# SimpleInjector';WebAPI请求生存期是否包含消息处理程序?

C# SimpleInjector';WebAPI请求生存期是否包含消息处理程序?,c#,asp.net-web-api,simple-injector,C#,Asp.net Web Api,Simple Injector,我是SimpleInjector的新手,并在WebAPI中使用SimpleInjector进行示例。我使用了SimpleInjector.Integration.WebApi.WebHost.QuickStartnu-get包,然后为我的测试注册了一个简单类型,如下所示: container.RegisterWebApiRequest<SimplePOCO>(); container.RegisterWebApiRequest(); 从ApiController方法内部,我可以请

我是SimpleInjector的新手,并在WebAPI中使用SimpleInjector进行示例。我使用了
SimpleInjector.Integration.WebApi.WebHost.QuickStart
nu-get包,然后为我的测试注册了一个简单类型,如下所示:

container.RegisterWebApiRequest<SimplePOCO>();
container.RegisterWebApiRequest();
从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;
}
受保护的覆盖任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌){
任务反应;
var container=SimpleInjectorWebApiInitializer.container;
var rc=container.GetInstance();
response=base.sendaync(请求、取消令牌);
response.ContinueWith((responseMsg)=>{});
返回响应;
}
调用带有以下消息的
GetInstance()
错误:

SimplePOCO类型的注册委托引发了异常。这个 SimplePOCO已注册为“Web API请求”生活方式,但 实例是在Web API请求的上下文之外请求的

我做错什么了吗?消息处理程序是否在WebAPI请求的生存期之外?考虑到它们的整体性,这似乎有些奇怪。如果消息处理程序在生存期之外,是否存在包含消息处理程序的更长生存期

消息处理程序是否在WebAPI请求的生存期之外

嗯,事实上,他们是。除非显式触发
IDependencyScope
的创建,否则
IDependencyScope
将在
DefaultHttpControllerActivator.Create
方法内创建(通过调用
request.GetDependencyScope()

要确保代码在依赖范围内运行,只需在处理程序内显式调用
request.GetDependencyScope()

受保护的覆盖任务SendAsync(
HttpRequestMessage请求,CancellationToken CancellationToken){
//触发范围的创建。
request.GetDependencyScope();
任务反应;
var container=SimpleInjectorWebApiInitializer.container;
var rc=container.GetInstance();
response=base.sendaync(请求、取消令牌);
response.ContinueWith((responseMsg)=>{});
返回响应;
}

“一次拯救世界一个软件解耦”。感谢你没有带我去处理我偷偷进入示例的容器的静态引用:-)@EBarr:我突然想到要说一些关于这个的事情,但我有种感觉,你以前听过这种说法:-)我每天都会想起它……我每天都在处理200万行的极端耦合。这只是在处理示例时的快速速记。也许可以将此添加到的最后一篇文章中,因为我想知道出了什么问题:)