.NET學習筆記之默認依賴注入
介紹
不要依賴于具體的實現(xiàn),應該依賴于抽象,高層模塊不應該依賴于底層模塊,二者應該依賴于抽象。簡單的說就是為了更好的解耦。而控制反轉(Ioc)就是這樣的原則的其中一個實現(xiàn)思路, 這個思路的其中一種實現(xiàn)方式就是依賴注入(DI)。ASP.NET Core內(nèi)置有對依賴注入(DI)的支持,開發(fā)者只需要定義好接口后,在Startup.cs的ConfigureServices方法里使用對應生命周期的綁定方法即可。
只要是用new實例化的都是存在依賴的。
生命周期
AddSingleton→AddTransient→AddScoped
Singleton(單例)
服務在第一次請求時被創(chuàng)建(或者當我們在ConfigureServices中指定創(chuàng)建某一實例并運行方法),其后的每次請求將沿用已創(chuàng)建服務。如果開發(fā)者的應用需要單例服務情景,請設計成允許服務容器來對服務生命周期進行操作,而不是手動實現(xiàn)單例設計模式然后由開發(fā)者在自定義類中進行操作。

services.AddSingleton<IApplicationService,ApplicationService>
比如某些公共類等
Scoped(作用域)
一次請求開始到請求結束 ,這次請求中獲取的對象都是同一個

services.AddScoped<IApplicationService,ApplicationService>
如果該service在一個請求過程中多次被用到,并且可能共享其中的字段或者屬性,那么就使用scoped,例如httpcontext (感謝群里老哥的幫助)
Transient(瞬時)
每一次獲取的對象都不是同一個,它最好被用于輕量級無狀態(tài)服務(如我們的Repository和ApplicationService服務)

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方法進行注入
構造函數(shù)注入
服務作為構造函數(shù)參數(shù)添加,并且運行時從服務容器中解析服務。
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>();
總結
到此這篇關于.NET學習筆記之默認依賴注入的文章就介紹到這了,更多相關.NET默認依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
記錄asp.net網(wǎng)站是什么原因導致停止運行的代碼
這篇文章主要介紹了記錄asp.net網(wǎng)站是什么原因導致停止運行的具體實現(xiàn)2014-03-03
Asp.Net Core控制器如何接收原始請求正文內(nèi)容詳解
這篇文章主要給大家介紹了關于Asp.Net Core控制器如何接收原始請求正文內(nèi)容的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-09-09
關于有些Asp.net項目發(fā)布后出現(xiàn)網(wǎng)址亂碼的解決方法
最近在部署一個網(wǎng)站,net2.0開發(fā)的,但是遇到一個很奇怪的問題。2011-07-07
詳解ASP.Net Core 中如何借助CSRedis實現(xiàn)一個安全高效的分布式鎖
這篇文章主要介紹了ASP.Net Core 中如何借助CSRedis實現(xiàn)一個安全高效的分布式鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

