為什么我應該使用AddScoped()我的存盤庫或服務?為什么不AddSingleton()呢?我知道它們之間的差異,但不明白為什么我不應該使用單例實體來避免為每個請求創建新物件。你能解釋一下嗎(最好用例子:))?
uj5u.com熱心網友回復:
正如你所說,你知道其中的區別,所以我不會進入那個。
您不希望為您的存盤庫或服務添加Singleton 的原因是因為通常您的存盤庫和服務被認為是“業務邏輯”和“持久性邏輯”。在您的業務邏輯中,您可能會設定一些類級別的變數。這些屬性對于每個請求不會有所不同,它們將在請求之間共享。(把它們想象成靜態屬性)。
例子:
假設您有一個用戶服務,它將發出請求的用戶的用戶名設定為類級別變數。
單例邏輯:
現在想象 Bob 向 api 發出請求。用戶名將設定為 "Bob" 。現在想象同時,John 向 api 發出請求。用戶名將設定為“John”。但由于用戶服務是單例,John 和 Bob 共享同一個實體,這意味著 Bob 的用戶名也將設定為“John”。
范圍邏輯:
想象一下與上面完全相同的場景,但是這次當 John 發出請求時,它不會覆寫 bobs 用戶名,因為它們是不同的實體。
uj5u.com熱心網友回復:
以下三種方法定義了服務的生命周期,
每次請求時都會創建 AddTransient 瞬態生命周期服務。這個生命周期最適合輕量級、無狀態的服務。
AddScoped Scoped 生命周期服務為每個請求創建一次。
AddSingleton Singleton 生命周期服務在第一次被請求時創建(或者如果您在其中指定實體,則在運行 ConfigureServices 時創建),然后每個后續請求都將使用相同的實體。
參考這里
假設您有一個 aspnet-core 專案。
如果你想在程式運行時只創建一次物件并且每次都使用同一個物件,你應該使用addingleton。
如果你希望一個物件在程式運行時每次收到請求時都再次成為 new(),你應該使用 addscoped()。
如果你想要一個物件 new() 每個請求和回應,你必須使用 AddTransient。
3 種方法的示例值
用資訊圖理解
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/475749.html
