2、ASP.NET Core中服務的生命週期

灰太狼的夢想發表於2021-04-24

       ASP.NET Core支援依賴注入軟體設計模式,它允許在不同的元件中注入我們的服務,並且控制服務的初始化。有些服務可以在短時間內初始化,並且只能在某個特別的元件,以及請求中才能用到;而還有一些服務,僅僅只用初始化一次,就可以在整個應用程式中使用。

下面我就講一講ASP.NET Core中服務的生命週期。

Singleton  --單例模式

     只有一個服務的例項被建立,這個例項,儲存在記憶體中,可以在整個應用程式中使用。我們可以對一些初始化代價比較大的服務,使用Singleton模式。在程式碼中可以這樣:

services.AddSingleton<IProductService, ProductService>();

Scoped  --作用域

     這種模式下,將會為每一個請求,都建立一個服務的例項。所有同一個請求中的中介軟體、MVC控制器,等等,都會得到一個相同的服務例項。Entity Framework Context就是一個Scoped服務最好的參考例子。我們可以通過使用AddScoped方法來使用Scoped模式:

services.AddScoped<IProductService, ProductService>();

Transient  --短暫的、瞬變的  

    Transient模式下,服務每次被請求的時候,都會建立一個服務例項,這種模式特別適合輕量級、無狀態的服務。我們可以使用AddTransient方法,來注入服務:

services.AddTransient<IProductService, ProductService>();

如果你想將上面我講到的概念形象化,那麼下面的圖示就是你快速參考的一個例子。

 

對下面圖示的解釋說明:

  • Singleton:單例模式下的服務,只有一個服務例項,所有的請求,都是共享著一個服務例項;這種模式下,我們需要併發以及多執行緒的問題;
  • Scoped:為每個請求都建立一個服務的例項,並且在這個請求中,都是可以多次重複使用這個服務例項;每個請求,可以看做一個作用域。request1可以使用服務1的例項,request2可以使用服務2的例項互不干涉;
  • Transient:這種模式下,不管是不是同一個請求,每次都會新建一個新的服務例項;這種是最常見的,並且是安全的選擇,如果你擔心多執行緒的問題的話。

 

 

相關文章