黄色电影一区二区,韩国少妇自慰A片免费看,精品人妻少妇一级毛片免费蜜桃AV按摩师 ,超碰 香蕉

.NET學(xué)習(xí)筆記之默認(rèn)依賴注入

.net學(xué)習(xí)筆記之默認(rèn)依賴注入

介紹

不要依賴于具體的實(shí)現(xiàn),應(yīng)該依賴于抽象,高層模塊不應(yīng)該依賴于底層模塊,二者應(yīng)該依賴于抽象。簡單的說就是為了更好的解耦。而控制反轉(zhuǎn)(ioc)就是這樣的原則的其中一個(gè)實(shí)現(xiàn)思路, 這個(gè)思路的其中一種實(shí)現(xiàn)方式就是依賴注入(di)。asp.net core內(nèi)置有對(duì)依賴注入(di)的支持,開發(fā)者只需要定義好接口后,在startup.cs的configureservices方法里使用對(duì)應(yīng)生命周期的綁定方法即可。

只要是用new實(shí)例化的都是存在依賴的。

生命周期

addsingleton→addtransient→addscoped

singleton(單例)

服務(wù)在第一次請(qǐng)求時(shí)被創(chuàng)建(或者當(dāng)我們?cè)赾onfigureservices中指定創(chuàng)建某一實(shí)例并運(yùn)行方法),其后的每次請(qǐng)求將沿用已創(chuàng)建服務(wù)。如果開發(fā)者的應(yīng)用需要單例服務(wù)情景,請(qǐng)?jiān)O(shè)計(jì)成允許服務(wù)容器來對(duì)服務(wù)生命周期進(jìn)行操作,而不是手動(dòng)實(shí)現(xiàn)單例設(shè)計(jì)模式然后由開發(fā)者在自定義類中進(jìn)行操作。

services.addsingleton<iapplicationservice,applicationservice>

比如某些公共類等

scoped(作用域)

一次請(qǐng)求開始到請(qǐng)求結(jié)束 ,這次請(qǐng)求中獲取的對(duì)象都是同一個(gè)

services.addscoped<iapplicationservice,applicationservice>

如果該service在一個(gè)請(qǐng)求過程中多次被用到,并且可能共享其中的字段或者屬性,那么就使用scoped,例如httpcontext (感謝群里老哥的幫助)

transient(瞬時(shí))

每一次獲取的對(duì)象都不是同一個(gè),它最好被用于輕量級(jí)無狀態(tài)服務(wù)(如我們的repository和applicationservice服務(wù))

services.addtransient<iapplicationservice,applicationservice>

如果該service在一次請(qǐng)求中只使用一次,那么就注冊(cè)transient就好了。

注入方式

  /// <summary>
  /// 用戶接口
  /// </summary>
  public interface iuserservice
  {
      string getname();
  }

  /// <summary>
  /// 用戶實(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)依賴注入的文章就介紹至此,更多相關(guān).net默認(rèn)依賴注入內(nèi)容請(qǐng)搜索碩編程以前的文章,希望大家多多支持碩編程

下一節(jié):asp.net基礎(chǔ)知識(shí)掃盲篇

asp.net編程技術(shù)

相關(guān)文章