為了在我的應用程式中強制執行授權,我通常使用授權裝飾器來裝飾每個域服務,這需要一些服務授權器來執行授權。
例如:CarService : ICarService裝飾有CarServiceAuthorizationDecorator : ICarService注入ICarServiceAuthorizer來執行授權,成功時呼叫實際的CarService.
這個設定對我很有幫助,除了一個一直困擾我的小細節:我必須在Token每次呼叫 時傳遞一些ICarService,因為授權者需要它。即使它沒有,那么CarService可能會呼叫CarOwnerShipService再次用授權器裝飾的 a,它也可能需要它。Tokens到處都是很多。
為了解決這個問題,我能想出的唯一方法是將一些像存盤設備一樣的東西注入到其中:您在開始時放入令牌,它會一直保留它以供任何將其取出的ITokenProvider服務CarServiceAuthorizer,因此不需要在每個方法呼叫中都傳遞它。
為此,該 ITokenProvider 的生命周期必須與執行緒的生命周期相同。不僅如此:新生成的執行緒也需要令牌。
所以我的問題是:有沒有辦法將 ITokenProvider 的生命周期限定為 .NET DI 中的執行緒,包括子執行緒?
(AddScoped我認為這似乎對我沒有幫助,因為并非我的應用程式中的所有執行緒都以 Web 請求開始。此外,我在新生成的執行緒上遇到了重大問題AddScoped,這將失去它們的狀態。)
uj5u.com熱心網友回復:
它就像一個存盤設備:您在開始時放入令牌,它會一直保存它以供任何獲取它的服務使用,因此不需要在每個方法呼叫中傳遞它。
AddScoped我認為,這似乎對我沒有幫助,因為并非我的應用程式中的所有執行緒都以 Web 請求開始。
根據第一句話,我認為 scopedITokenProvider正是您所需要的(盡管沒有看到實際代碼,這更像是一種猜測)。只需在需要時創建一個作用域并使用它,不要依賴執行緒(即您可以使用相同的作用域生成多個執行緒)。沿著這條線的東西:
IServiceProvider serviceProvider = ...;
using (var serviceScope = serviceProvider.CreateScope())
{
var tokenService = serviceProvider.GetRequiredService<ITokenProvider>(); // or even split `ITokenProvider` into two interfaces
tokenService.SetToken("");
// resolve and call something using the token somewhere down the pipeline ...
// Maybe even with Task.Run(...)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530253.html
