0

我想從ActionFilter.OnActionExecuted上的容器中獲取一個實例。依賴關係在Web api中用Lifestyle.Scoped註冊。 在調試問題後,我可以看到過濾器中返回的實例與請求期間返回的實例不同(例如注入到控制器中)WebApiRequestLifestyle作用域何時完成?

任何人都可以請解釋什麼是webapirequest生活方式的開始和結束範圍?

回答

1

WebApiRequestLifestyle的範圍是在Web API調用IDependencyResolver.BeginScope()時創建的,它在返回的IDependencyScope實例上調用Dispose()時結束。

在過去,我注意到Web APIs設計中的一些非常奇怪的怪癖,它們與範圍和異步性有關。例如,在異步流程完成後,Web API調用IDependencyScope.Dispose()。這意味着在致電IDependencyScope.Dispose()時,在該時間點使用CallContext.SetLogicalData在請求開始時存儲的任何數據都無法再被檢索到。所以在請求結束和處理範圍之間存在差距。簡單注射器取決於請求解析範圍實例期間CallContext的可用性。

可能發生的情況是Web API在此間隙中調用您的OnActionExecuted。只有很少的開發者會注意到這個怪癖,因爲通常在差距的時候,所有的依賴都已經解決了。但是,如果您在該階段解決服務問題,那麼Web API中會出現問題。