.NET Core 注入三種模式


原文來源:.NET學習筆記之默認依賴注入_實用技巧_腳本之家 (jb51.net)

介紹

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

只要是用new實例化的都是存在依賴的。

生命周期

AddSingleton→AddTransient→AddScoped

Singleton(單例)

服務在第一次請求時被創建(或者當我們在ConfigureServices中指定創建某一實例並運行方法),其后的每次請求將沿用已創建服務。如果開發者的應用需要單例服務情景,請設計成允許服務容器來對服務生命周期進行操作,而不是手動實現單例設計模式然后由開發者在自定義類中進行操作。

services.AddSingleton<IApplicationService,ApplicationService>

比如某些公共類等

Scoped(作用域)

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

services.AddScoped<IApplicationService,ApplicationService>

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

Transient(瞬時)

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

services.AddTransient<IApplicationService,ApplicationService>

如果該service在一次請求中只使用一次,那么就注冊Transient就好了。

注入方式

/// <summary>
/// 用戶接口
/// </summary>
public  interface  IUserService
{
     string  GetName();
}
 
/// <summary>
/// 用戶實現
/// </summary>
public  class  UserService : IUserService
{
     public  string  GetName()
     {
         return  "AZRNG" ;
     }
}

需要在ConfigureServices方法進行注入

構造函數注入

服務作為構造函數參數添加,並且運行時從服務容器中解析服務。

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)
{
     //將服務生命期的范圍限定為單個請求的生命期
     services.AddTransient<IUserService, UserService>();
}

獲取服務

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中獲取服務

var provider = services.BuildServiceProvider();
var userserivce = provider.GetService<IUserService>();
//或
var userservice2 = provider.GetRequiredService<IUserService>();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM