給自己一個目標,然后堅持一段時間,總會有收獲和感悟!
對于.net core而言,依賴注入生命周期有三種瞬態(tài)(Transient)、作用域(Scoped)和單例(Singleton),無論使用哪種生命周期,都需要確保對象的線程安全性,并正確地處理依賴關(guān)系。
一、程序生命周期
在了解依賴注入的生命周期前,我們先建單了解下應(yīng)用程序的生命周期,
在 .NET Core 6.0 中,應(yīng)用程序的生命周期包括以下階段:
2.1、構(gòu)造函數(shù)
在應(yīng)用程序啟動時,會調(diào)用構(gòu)造函數(shù)來創(chuàng)建主機(Host)對象。
2.2、配置
在構(gòu)造函數(shù)之后,會調(diào)用配置方法來設(shè)置應(yīng)用程序的配置,例如添加服務(wù)、配置中間件等。
2.3、啟動
配置完成后,會調(diào)用啟動方法來啟動應(yīng)用程序,包括啟動 HTTP 服務(wù)器、啟動后臺服務(wù)等。
2.4、運行
應(yīng)用程序開始監(jiān)聽請求并進行處理,這是應(yīng)用程序的主要運行階段。
2.5、停止
當應(yīng)用程序接收到停止信號時(如收到終止命令或服務(wù)器關(guān)閉),會觸發(fā)停止方法來執(zhí)行一些清理操作。
2.6、釋放資源
在停止之后,應(yīng)用程序釋放資源并進行善后工作,如關(guān)閉數(shù)據(jù)庫連接、釋放資源等。
除了上述階段外,還可以通過使用生命周期中的事件鉤子來添加自定義邏輯,以便在特定時刻執(zhí)行某些代碼。
需要注意的是,不同類型的應(yīng)用程序(如控制臺應(yīng)用程序、Web 應(yīng)用程序等)的生命周期可以有所不同,但上述階段是通用的核心生命周期。
二、依賴注入生命周期
在 .NET Core 6.0 中,依賴注入服務(wù)的生命周期有三種:瞬態(tài)(Transient)、作用域(Scoped)和單例(Singleton)。
2.1、瞬態(tài)生命周期
在每次請求時都會創(chuàng)建一個新的實例,并在請求結(jié)束時立即銷毀該實例,適用于輕量級的對象。這種生命周期可以通過
services.AddTransient 方法進行注冊。
2.2、作用域生命周期
在每個 HTTP 請求處理期間,會使用同一個實例,請求結(jié)束時實例也會被銷毀,適用于線程安全的對象,如 EF 上下文。這種生命周期可以通過
services.AddScoped 方法進行注冊。
2.3、單例生命周期
在整個應(yīng)用程序生命周期中只會創(chuàng)建一個實例,適用于被多處使用的對象,如配置信息、單例服務(wù)等。這種生命周期可以通過
services.AddSingleton 方法進行注冊。
除了上述生命周期外,還可以通過 services.AddSingleton 方法傳遞一個工廠方法,以實現(xiàn)自定義的生命周期管理。
無論使用哪種生命周期,都需要確保對象的線程安全性,并正確地處理依賴關(guān)系。正確使用依賴注入可以提高代碼的可測試性和可維護性,將對象的創(chuàng)建和銷毀等生命周期管理交由 DI 容器負責,從而簡化代碼的編寫。
三、代碼舉例
當使用 .NET Core 6.0 進行依賴注入時,可以使用以下代碼示例來演示瞬態(tài)、作用域和單例生命周期
3.1、瞬態(tài)生命周期
public interface ITransientService
{
void DoSomething();
}
public class TransientService : ITransientService
{
private readonly Guid _id;
public TransientService()
{
_id = Guid.NewGuid();
}
public void DoSomething()
{
Console.WriteLine($"TransientService ID: {_id}");
}
}
// 在 Startup.cs 的 ConfigureServices 方法中添加以下代碼:
services.AddTransient<ITransientService, TransientService>();
// 在需要使用服務(wù)的地方,使用構(gòu)造函數(shù)注入:
public class MyController
{
private readonly ITransientService _transientService;
public MyController(ITransientService transientService)
{
_transientService = transientService;
}
// 使用服務(wù)
public void MyAction()
{
_transientService.DoSomething();
}
}
3.2、作用域生命周期
public interface IScopeService
{
void DoSomething();
}
public class ScopeService : IScopeService
{
private readonly Guid _id;
public ScopeService()
{
_id = Guid.NewGuid();
}
public void DoSomething()
{
Console.WriteLine($"ScopeService ID: {_id}");
}
}
// 在 Startup.cs 的 ConfigureServices 方法中添加以下代碼:
services.AddScoped<IScopeService, ScopeService>();
// 在需要使用服務(wù)的地方,使用構(gòu)造函數(shù)注入:
public class MyController
{
private readonly IScopeService _scopeService;
public MyController(IScopeService scopeService)
{
_scopeService = scopeService;
}
// 使用服務(wù)
public void MyAction()
{
_scopeService.DoSomething();
}
}
3.3、單例生命周期
public interface ISingletonService
{
void DoSomething();
}
public class SingletonService : ISingletonService
{
private readonly Guid _id;
public SingletonService()
{
_id = Guid.NewGuid();
}
public void DoSomething()
{
Console.WriteLine($"SingletonService ID: {_id}");
}
}
// 在 Startup.cs 的 ConfigureServices 方法中添加以下代碼:
services.AddSingleton<ISingletonService, SingletonService>();
// 在需要使用服務(wù)的地方,使用構(gòu)造函數(shù)注入:
public class MyController
{
private readonly ISingletonService _singletonService;
public MyController(ISingletonService singletonService)
{
_singletonService = singletonService;
}
// 使用服務(wù)
public void MyAction()
{
_singletonService.DoSomething();
}
}
以上示例展示了如何在 .NET Core 6.0 中注冊和使用瞬態(tài)、作用域和單例生命周期的依賴注入服務(wù)。
根據(jù)實際需求,選擇適合的生命周期以確保正確的對象創(chuàng)建和銷毀,并維護正確的對象狀態(tài)。
四、自定義管理
當通過 services.AddSingleton 方法傳遞一個工廠方法時,可以使用委托來創(chuàng)建自定義的生命周期管理。
-
下面是一個示例代碼:
首先,定義一個自定義的服務(wù)類 CustomService:
public class CustomService
{
public DateTime CreatedAt { get; }public CustomService()
{
CreatedAt = DateTime.Now;
}
}
然后,在應(yīng)用程序啟動時,注冊該服務(wù)并傳遞一個工廠方法來實現(xiàn)自定義的生命周期管理:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(serviceProvider =>
{
// 創(chuàng)建 CustomService 對象,并進行自定義的處理
var customService = new CustomService();
// 在此可以添加自定義的生命周期管理邏輯
return customService;
});
// 其他服務(wù)的注冊
// ...
}
}
在上述示例中,通過 services.AddSingleton(serviceProvider => { … }) 方法向 DI 容器注冊了一個 CustomService 類型的單例服務(wù),傳遞了一個工廠方法作為參數(shù)。
在這個工廠方法中,我們可以自定義創(chuàng)建 CustomService 對象的方式,并進行額外的處理。
這樣,當通過 DI 容器解析 CustomService 時,每次獲取到的都是通過工廠方法創(chuàng)建的同一個實例,而且可以根據(jù)需要在工廠方法中進行自定義的生命周期管理操作。
需要注意的是,工廠方法可以接收一個 IServiceProvider 參數(shù),以便在創(chuàng)建服務(wù)實例時獲取其他已注冊的服務(wù)。這在某些場景下可能會很有用。
五、依賴注入原理
在 .NET Core 6.0 中,依賴注入(DI)是一個重要的功能,它通過提供、解析和跟蹤應(yīng)用程序中的各種服務(wù)對象來幫助解耦和組織代碼。
依賴注入的原理主要包括以下幾個方面:
1.服務(wù)注冊:在應(yīng)用程序啟動時,通過使用
IServiceCollection 接口的 AddTransient、AddScoped、AddSingleton 等方法將服務(wù)類型和其生命周期添加到 DI 容器中。
2.服務(wù)解析:當需要使用某個服務(wù)的實例時,可以通過 DI 容器提供的
IServiceProvider 接口的 GetRequiredService、GetService 等方法來獲取該服務(wù)的實例,其中 T 是服務(wù)類型。
3.生命周期管理:DI 容器會根據(jù)服務(wù)的生命周期設(shè)置來控制服務(wù)對象的創(chuàng)建和銷毀。根據(jù)服務(wù)的生命周期,可以使用
AddTransient、AddScoped、AddSingleton 方法注冊瞬態(tài)、作用域和單例服務(wù)。文章來源:http://www.zghlxwxcb.cn/news/detail-768411.html
- 瞬態(tài)(Transient)生命周期表示每次通過 DI 容器獲取服務(wù)時都會創(chuàng)建一個新的實例。
- 作用域(Scoped)生命周期表示在同一個作用域內(nèi)(例如,相同的 HTTP 請求)獲取服務(wù)時將使用同一個實例。
- 單例(Singleton)生命周期表示整個應(yīng)用程序中只創(chuàng)建一個實例,并且所有的請求都會使用同一個實例。
1.依賴關(guān)系解析:DI 容器能夠自動解析服務(wù)對象之間的依賴關(guān)系,即當需要解析某個服務(wù)時,DI 容器會自動創(chuàng)建該服務(wù)所依賴的其他服務(wù)實例,并將其注入到需要的位置上。
2.服務(wù)擴展:通過擴展
IServiceCollection 接口,可以自定義添加和配置服務(wù),使得 DI 容器能夠支持更多的功能和擴展。
總體而言,.NET Core 6.0 的依賴注入原理基于 DI 容器、服務(wù)注冊、服務(wù)解析和生命周期管理,幫助開發(fā)者更好地組織和管理應(yīng)用程序中的各種服務(wù)對象,提高代碼的可擴展性、可測試性和松耦合性。文章來源地址http://www.zghlxwxcb.cn/news/detail-768411.html
到了這里,關(guān)于【C#】.net core 6.0 依賴注入生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!