WebApiRequestLifestyle范围何时结束?

时间:2016-10-11 09:15:11

标签: asp.net-web-api dependency-injection async-await simple-injector

我正在尝试从ActionFilter.OnActionExecuted上的容器中获取一个实例。依赖项已在Lifestyle.Scoped中注册到web api中。 调试问题后,我可以看到过滤器中返回的实例与请求期间返回的实例不同(例如注入控制器)

任何人都可以解释一下webapirequest生活方式范围的起点和终点究竟是什么?

1 个答案:

答案 0 :(得分:1)

WebApiRequestLifestyle的范围是在Web API调用IDependencyResolver.BeginScope()时创建的,一旦在返回的Dispose()实例上调用IDependencyScope就会结束。

在过去,我注意到Web API设计中有一些非常奇怪的怪癖,它们与范围和异步性有关。例如,在异步流程已经完成之后,Web API调用IDependencyScope.Dispose()。这意味着在调用IDependencyScope.Dispose()时,在该时间点无法再检索使用CallContext.SetLogicalData在请求开始时存储的任何数据。因此,请求的结束与范围的处理之间存在差距。 Simple Injector取决于在解析作用域实例的请求期间CallContext的可用性。

可能发生的事情是,在此差距期间,Web API会调用您的OnActionExecuted。只有少数开发人员注意到这个怪癖,因为通常,在差距期间,所有依赖关系都已经解决。但是,如果您在该阶段解析服务,那么Web API就会出现问题。