我想從ActionFilter.OnActionExecuted上的容器中獲取一個實例。依賴關係在Web api中用Lifestyle.Scoped註冊。 在調試問題後,我可以看到過濾器中返回的實例與請求期間返回的實例不同(例如注入到控制器中)WebApiRequestLifestyle作用域何時完成?
任何人都可以請解釋什麼是webapirequest生活方式的開始和結束範圍?
我想從ActionFilter.OnActionExecuted上的容器中獲取一個實例。依賴關係在Web api中用Lifestyle.Scoped註冊。 在調試問題後,我可以看到過濾器中返回的實例與請求期間返回的實例不同(例如注入到控制器中)WebApiRequestLifestyle作用域何時完成?
任何人都可以請解釋什麼是webapirequest生活方式的開始和結束範圍?
WebApiRequestLifestyle
的範圍是在Web API調用IDependencyResolver.BeginScope()
時創建的,它在返回的IDependencyScope
實例上調用Dispose()
時結束。
在過去,我注意到Web APIs設計中的一些非常奇怪的怪癖,它們與範圍和異步性有關。例如,在異步流程完成後,Web API調用IDependencyScope.Dispose()
。這意味着在致電IDependencyScope.Dispose()
時,在該時間點使用CallContext.SetLogicalData
在請求開始時存儲的任何數據都無法再被檢索到。所以在請求結束和處理範圍之間存在差距。簡單注射器取決於請求解析範圍實例期間CallContext
的可用性。
可能發生的情況是Web API在此間隙中調用您的OnActionExecuted
。只有很少的開發者會注意到這個怪癖,因爲通常在差距的時候,所有的依賴都已經解決了。但是,如果您在該階段解決服務問題,那麼Web API中會出現問題。