.NET學(xué)習(xí)筆記之默認(rèn)依賴(lài)注入
介紹
不要依賴(lài)于具體的實(shí)現(xiàn),應(yīng)該依賴(lài)于抽象,高層模塊不應(yīng)該依賴(lài)于底層模塊,二者應(yīng)該依賴(lài)于抽象。簡(jiǎn)單的說(shuō)就是為了更好的解耦。而控制反轉(zhuǎn)(Ioc)就是這樣的原則的其中一個(gè)實(shí)現(xiàn)思路, 這個(gè)思路的其中一種實(shí)現(xiàn)方式就是依賴(lài)注入(DI)。ASP.NET Core內(nèi)置有對(duì)依賴(lài)注入(DI)的支持,開(kāi)發(fā)者只需要定義好接口后,在Startup.cs的ConfigureServices方法里使用對(duì)應(yīng)生命周期的綁定方法即可。
只要是用new實(shí)例化的都是存在依賴(lài)的。
生命周期
AddSingleton→AddTransient→AddScoped
Singleton(單例)
服務(wù)在第一次請(qǐng)求時(shí)被創(chuàng)建(或者當(dāng)我們?cè)贑onfigureServices中指定創(chuàng)建某一實(shí)例并運(yùn)行方法),其后的每次請(qǐng)求將沿用已創(chuàng)建服務(wù)。如果開(kāi)發(fā)者的應(yīng)用需要單例服務(wù)情景,請(qǐng)?jiān)O(shè)計(jì)成允許服務(wù)容器來(lái)對(duì)服務(wù)生命周期進(jìn)行操作,而不是手動(dòng)實(shí)現(xiàn)單例設(shè)計(jì)模式然后由開(kāi)發(fā)者在自定義類(lèi)中進(jìn)行操作。
services.AddSingleton<IApplicationService,ApplicationService>
比如某些公共類(lèi)等
Scoped(作用域)
一次請(qǐng)求開(kāi)始到請(qǐng)求結(jié)束 ,這次請(qǐng)求中獲取的對(duì)象都是同一個(gè)
services.AddScoped<IApplicationService,ApplicationService>
如果該service在一個(gè)請(qǐng)求過(guò)程中多次被用到,并且可能共享其中的字段或者屬性,那么就使用scoped,例如httpcontext (感謝群里老哥的幫助)
Transient(瞬時(shí))
每一次獲取的對(duì)象都不是同一個(gè),它最好被用于輕量級(jí)無(wú)狀態(tài)服務(wù)(如我們的Repository和ApplicationService服務(wù))
services.AddTransient<IApplicationService,ApplicationService>
如果該service在一次請(qǐng)求中只使用一次,那么就注冊(cè)Transient就好了。
注入方式
/// <summary> /// 用戶(hù)接口 /// </summary> public interface IUserService { string GetName(); } /// <summary> /// 用戶(hù)實(shí)現(xiàn) /// </summary> public class UserService : IUserService { public string GetName() { return "AZRNG"; } }
需要在ConfigureServices方法進(jìn)行注入
構(gòu)造函數(shù)注入
服務(wù)作為構(gòu)造函數(shù)參數(shù)添加,并且運(yùn)行時(shí)從服務(wù)容器中解析服務(wù)。
private readonly IUserService _userService; public UserController(IUserService userService) { _userService = userService; } [HttpGet] public ActionResult GetName() { return Ok(_userService.GetName()); } FromServices操作注入 [HttpGet] public ActionResult GetName([FromServices] IUserService _userService) { return Ok(_userService.GetName()); }
核心
在.NET Core中DI的核心分為兩個(gè)組件:IServiceCollection和 IServiceProvider。
- IServiceCollection負(fù)責(zé)注冊(cè)
- IServiceProvider負(fù)責(zé)提供實(shí)例
public void ConfigureServices(IServiceCollection services) { //將服務(wù)生命期的范圍限定為單個(gè)請(qǐng)求的生命期 services.AddTransient<IUserService, UserService>(); }
獲取服務(wù)
private readonly IUserService _userService; public HomeController(IUserService userService) { _userService = userService; } public IActionResult Index() { var info = _userService.GetInfo(); return View(); }
IServiceProvider獲取
private readonly IServiceProvider _service; public UserController(IServiceProvider service) { _service = service; } [HttpGet] public ActionResult GetName() { var _userService = (IUserService)_service.GetService(typeof(IUserService)); return Ok(_userService.GetName()); }
statrup中獲取服務(wù)
var provider = services.BuildServiceProvider(); var userserivce = provider.GetService<IUserService>(); //或 var userservice2 = provider.GetRequiredService<IUserService>();
總結(jié)
到此這篇關(guān)于.NET學(xué)習(xí)筆記之默認(rèn)依賴(lài)注入的文章就介紹到這了,更多相關(guān).NET默認(rèn)依賴(lài)注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- .NET Core中依賴(lài)注入AutoMapper的方法示例
- 在.NET Core控制臺(tái)程序中如何使用依賴(lài)注入詳解
- 詳解ASP.NET Core 在 JSON 文件中配置依賴(lài)注入
- 詳解ASP.NET Core 中的框架級(jí)依賴(lài)注入
- 解讀ASP.NET 5 & MVC6系列教程(7):依賴(lài)注入
- ASP.NET MVC實(shí)現(xiàn)依賴(lài)注入的完整過(guò)程
- ASP.NET Core 過(guò)濾器中使用依賴(lài)注入知識(shí)點(diǎn)總結(jié)
- .NET IoC模式依賴(lài)反轉(zhuǎn)(DIP)、控制反轉(zhuǎn)(Ioc)、依賴(lài)注入(DI)
- 詳解asp.net core 依賴(lài)注入
相關(guān)文章
C#精髓 GridView72大絕技 學(xué)習(xí)gridview的朋友必看
C#精髓 GridView72大絕技 學(xué)習(xí)gridview的朋友可以參考下。2009-10-10window.showModalDialog兩次加載問(wèn)題清除緩存方法
window.showModalDialog兩次加載問(wèn)題:你第一次打開(kāi)窗口后,第二次瀏覽器沒(méi)有從服務(wù)器端取數(shù)據(jù),而直接找到了你已經(jīng)下載的文件2013-08-08如何使用pm2守護(hù)你的.NET Core應(yīng)用程序詳解
pm2是nodejs的一個(gè)帶有負(fù)載均衡功能的應(yīng)用進(jìn)程管理器的模塊,下面這篇文章主要給大家介紹了關(guān)于如何使用pm2守護(hù)你的.NET Core應(yīng)用程序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-10-10VS2017做為Unity3D的腳本編輯器需要的最精簡(jiǎn)組件
這篇文章主要為大家詳細(xì)介紹了VS2017做為Unity3D的腳本編輯器需要的最精簡(jiǎn)組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04IIS應(yīng)用池回收造成Application_Start中定時(shí)執(zhí)行程序停止的問(wèn)題的解決方法
最近在做一個(gè)項(xiàng)目,需要在程序中定時(shí)不斷的執(zhí)行某些操作,結(jié)果發(fā)現(xiàn)每天7,8點(diǎn)過(guò)后到第二天9點(diǎn),定時(shí)程序經(jīng)常都沒(méi)有在執(zhí)行,后來(lái)才知道由于IIS的應(yīng)用池回收導(dǎo)致Application停止。2010-03-03更方便快捷的外部操作數(shù)據(jù)庫(kù)的方法(另類(lèi)玩法)
數(shù)據(jù)庫(kù)操作方法很多,各種各樣但是外部操作數(shù)據(jù)庫(kù)的方法就會(huì)顯得格外陌生了,感興趣的朋友可以詳細(xì)了解下本文,或許對(duì)你學(xué)習(xí)ado.net有所幫助2013-02-02文本框中輸入小寫(xiě)字母即時(shí)轉(zhuǎn)換為大寫(xiě)實(shí)現(xiàn)思路
系統(tǒng)中有一個(gè)文本框,要求輸入大寫(xiě)字母,只是用戶(hù)不是那么配合所以只好在程序來(lái)控制了,感興趣的朋友可以參考下哈2013-03-03