.net學(xué)習(xí)筆記之默認依賴注入
介紹
不要依賴于具體的實現(xiàn),應(yīng)該依賴于抽象,高層模塊不應(yīng)該依賴于底層模塊,二者應(yīng)該依賴于抽象。簡單的說就是為了更好的解耦。而控制反轉(zhuǎn)(ioc)就是這樣的原則的其中一個實現(xiàn)思路, 這個思路的其中一種實現(xiàn)方式就是依賴注入(di)。asp.net core內(nèi)置有對依賴注入(di)的支持,開發(fā)者只需要定義好接口后,在startup.cs的configureservices方法里使用對應(yīng)生命周期的綁定方法即可。
只要是用new實例化的都是存在依賴的。
生命周期
addsingleton→addtransient→addscoped
singleton(單例)
服務(wù)在第一次請求時被創(chuàng)建(或者當我們在configureservices中指定創(chuàng)建某一實例并運行方法),其后的每次請求將沿用已創(chuàng)建服務(wù)。如果開發(fā)者的應(yīng)用需要單例服務(wù)情景,請設(shè)計成允許服務(wù)容器來對服務(wù)生命周期進行操作,而不是手動實現(xiàn)單例設(shè)計模式然后由開發(fā)者在自定義類中進行操作。
services.addsingleton<iapplicationservice,applicationservice>
比如某些公共類等
scoped(作用域)
一次請求開始到請求結(jié)束 ,這次請求中獲取的對象都是同一個
services.addscoped<iapplicationservice,applicationservice>
如果該service在一個請求過程中多次被用到,并且可能共享其中的字段或者屬性,那么就使用scoped,例如httpcontext (感謝群里老哥的幫助)
transient(瞬時)
每一次獲取的對象都不是同一個,它最好被用于輕量級無狀態(tài)服務(wù)(如我們的repository和applicationservice服務(wù))
services.addtransient<iapplicationservice,applicationservice>
如果該service在一次請求中只使用一次,那么就注冊transient就好了。
注入方式
/// <summary> /// 用戶接口 /// </summary> public interface iuserservice { string getname(); } /// <summary> /// 用戶實現(xiàn) /// </summary> public class userservice : iuserservice { public string getname() { return "azrng"; } }
需要在configureservices方法進行注入
構(gòu)造函數(shù)注入
服務(wù)作為構(gòu)造函數(shù)參數(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的核心分為兩個組件:iservicecollection和 iserviceprovider。
- iservicecollection負責注冊
- iserviceprovider負責提供實例
public void configureservices(iservicecollection services) { //將服務(wù)生命期的范圍限定為單個請求的生命期 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í)筆記之默認依賴注入的文章就介紹至此,更多相關(guān).net默認依賴注入內(nèi)容請搜索碩編程以前的文章,希望大家多多支持碩編程!