一文看懂:ASP.NET Core內(nèi)置對依賴注入!
介紹
不要依賴于具體的實(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>();


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

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