<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文看懂:ASP.NET Core內(nèi)置對依賴注入!

          共 5555字,需瀏覽 12分鐘

           ·

          2021-05-30 07:08

          介紹

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

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

          注入方式

              /// <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)行時從服務(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());
                  }

          生命周期

          AddSingleton→AddTransient→AddScoped

          Singleton(單例)

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

          services.AddSingleton<IApplicationService,ApplicationService>

          Scoped(作用域)

          請求開始到請求結(jié)束 ,這次請求中獲取的對象都是同一個

          services.AddScoped<IApplicationService,ApplicationService>

          Transient(瞬時)

          每一次獲取的對象都不是同一個,它最好被用于輕量級無狀態(tài)服務(wù)(如我們的Repository和ApplicationService服務(wù))

          services.AddTransient<IApplicationService,ApplicationService>

          核心

          在.NET Core中DI的核心分為兩個組件:IServiceCollection和 IServiceProvider。

          • IServiceCollection負(fù)責(zé)注冊
          • IServiceProvider負(fù)責(zé)提供實(shí)例
          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>();







          回復(fù) 【關(guān)閉】學(xué)關(guān)
          回復(fù) 【實(shí)戰(zhàn)】獲取20套實(shí)戰(zhàn)源碼
          回復(fù) 【被刪】學(xué)
          回復(fù) 【訪客】學(xué)
          回復(fù) 【小程序】學(xué)獲取15套【入門+實(shí)戰(zhàn)+賺錢】小程序源碼
          回復(fù) 【python】學(xué)微獲取全套0基礎(chǔ)Python知識手冊
          回復(fù) 【2019】獲取2019 .NET 開發(fā)者峰會資料PPT
          回復(fù) 【加群】加入dotnet微信交流群

          被網(wǎng)易云刷屏的人格顏色測試,我來總結(jié)下……爆火,點(diǎn)擊查看>>>


          【限時刪】劉*55頁ppt大瓜,比項(xiàng)*醒的還要精彩!


          瀏覽 51
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  淫香淫色综合网 | 免费18网站 | 成人夜色激情福利av | 日韩AV免费在线 | 91狠狠综合久 |