ASP.NET Core中的依賴問題解決方法示例
如何解決 ASP.NET Core 中的依賴問題
依賴性注入是一種技術(shù),它允許我們注入一個(gè)特定類的依賴對(duì)象,而不是直接創(chuàng)建這些實(shí)例。
使用依賴注入的好處顯而易見,它通過放松模塊間的耦合,來(lái)增強(qiáng)系統(tǒng)的可維護(hù)性和可測(cè)試性。
依賴注入允許我們修改具體實(shí)現(xiàn),而不必改變依賴于它們的依賴類型。
ASP.NET Core 很重視依賴注入技術(shù)。ASP.NET Core 中內(nèi)置的依賴注入提供功能模塊,并不像 StructureMap 和 Ninject 等IoC(控制反轉(zhuǎn))容器那樣功能豐富,但它速度快,易于配置,而且易于使用。我們可以使用它在 ASP.NET Core 中注入框架服務(wù)和應(yīng)用程序服務(wù)。
關(guān)于依賴注入和控制反轉(zhuǎn)的有關(guān)知識(shí)可以參考:設(shè)計(jì)模式。
我們將介紹三種不同方法來(lái)解決 ASP.NET Core 6 中的依賴項(xiàng)。
本文中提供的代碼示例均默認(rèn)運(yùn)行在 Visual Studio 2022。
1. 使用 VS2022 創(chuàng)建 ASP.NET Core 項(xiàng)目
我們?cè)?Visual Studio 2022 中創(chuàng)建一個(gè) ASP.NET Core 項(xiàng)目。按照以下步驟在 Visual Studio 2022 中創(chuàng)建一個(gè)新的 ASP.NET Core Web API 6 項(xiàng)目。
- 1) 啟動(dòng) Visual Studio 2022 IDE。
- 2) 單擊 “Create new project”。
- 3) 在 “Create new project” 窗口中,從顯示的模板列表中選擇 “ASP.NET Core Web API”。
- 4) 點(diǎn)擊下一步。
- 5) 在 “Configure your new project” 窗口中,指定新項(xiàng)目的名稱和位置。
- 6) 根據(jù)您的偏好,可選擇選中 “Place solution and project in the same directory” 復(fù)選框。
- 7) 點(diǎn)擊下一步。
- 8) 在接下來(lái)顯示的 “Additional Information” 窗口中,從頂部的下拉列表中選擇 .NET 6.0 作為目標(biāo)框架。將 “Authentication Type” 保留為 “None”(默認(rèn))。
- 9) 確保未選中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 復(fù)選框,因?yàn)槲覀儾粫?huì)在此處使用任何這些功能。您也可以選擇取消選中 “Use controllers(取消選中以使用最少的 API)” 復(fù)選框,因?yàn)槲覀儗?chuàng)建自己的控制器。
- 10) 單擊創(chuàng)建。
這將在 Visual Studio 2022 中創(chuàng)建一個(gè)新的 ASP.NET Core 6 Web API 項(xiàng)目。我們將在本文的后續(xù)部分中使用該項(xiàng)目來(lái)說明解析依賴項(xiàng)。
2. 使用構(gòu)造函數(shù)注入解決依賴關(guān)系
現(xiàn)在創(chuàng)建以下接口:
public interface ICustomFileLogger
{
public string Text { get; set; }
public void Log(string message);
}為簡(jiǎn)單起見,我們給出一個(gè)最小的表示。
CustomFileLogger 類實(shí)現(xiàn) ICustomFileLogger 接口,代碼如下:
public class CustomFileLogger : ICustomFileLogger
{
public string Text { get; set; }
public void Log(string message)
{
// 自己的實(shí)現(xiàn)邏輯
}
}如果使用的是 ASP.NET 5,可以在 ConfigureServices 方法中注冊(cè)一個(gè) ICustomFileLogger 類型的實(shí)例作為一個(gè) Scoped 服務(wù)。如果使用的是 ASP.NET 6,則直接在 Program.cs 文件中注冊(cè)。
services.AddScoped<ICustomFileLogger, CustomFileLogger>();
接下來(lái),創(chuàng)建一個(gè)名為 DefaultController 的 API 控制器并輸入以下代碼:
[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
private ICustomFileLogger _logger;
public DefaultController(ICustomFileLogger logger)
{
_logger = logger;
if(string.IsNullOrEmpty(_logger.Text))
_logger.Text = DateTime.UtcNow.ToString();
}
[HttpGet]
public string Get()
{
return "Hello World!";
}
}注意這里是如何使用構(gòu)造函數(shù)注入的。DefaultController 類的構(gòu)造函數(shù)接受 ICustomFileLogger 類型的實(shí)例作為參數(shù)。
3. 使用動(dòng)作方法注入解決依賴關(guān)系
當(dāng)需要在多個(gè)方法中使用注入的實(shí)例時(shí),我們應(yīng)該使用構(gòu)造函數(shù)注入。如果只需要在特定的動(dòng)作方法中使用實(shí)例,最好在動(dòng)作方法中注入實(shí)例,而不是使用構(gòu)造函數(shù)注入。
以下代碼片段說明了如何實(shí)現(xiàn)動(dòng)作方法注入。
[HttpPost("Log")]
public IActionResult Log([FromServices] ICustomFileLogger customFileLogger)
{
// 自己的實(shí)現(xiàn)邏輯
return Ok();
}4. 使用 IServiceProvider 解決依賴關(guān)系
我們有時(shí)候可能經(jīng)常需要在控制器中注入許多不同的服務(wù)。如果使用構(gòu)造函數(shù)注入,則必須在構(gòu)造函數(shù)中指定多個(gè)參數(shù)。所以,這種場(chǎng)景下,有一個(gè)更好的解決方案,就是使用 IServiceProvider。
我們可以使用 IServiceCollection 接口來(lái)創(chuàng)建依賴項(xiàng)注入容器。一旦創(chuàng)建了容器,IServiceCollection 實(shí)例就會(huì)組合成一個(gè) IServiceProvider 實(shí)例。我們可以使用此實(shí)例來(lái)解析服務(wù)。
我們可以將 IServiceProvider 類型的實(shí)例注入到類的任何方法中。您還可以利用 IApplicationBuilder 接口的 ApplicationServices 屬性和 HttpContext 類的 RequestServices 屬性來(lái)檢索 IServiceProvider 實(shí)例。
以下代碼說明了如何注入 IServiceProvider 類型的實(shí)例:
public class DefaultController : Controller
{
private IServiceProvider _provider;
public DefaultController(IServiceProvider provider)
{
_provider = provider;
}
}我們可以在操作方法中使用以下代碼,來(lái)檢索需要的任何服務(wù)實(shí)例。
ICustomFileLogger logger = (ICustomFileLogger)_provider.GetService(typeof(ICustomFileLogger));
注意 IServiceProvider 的 GetService 方法是如何用來(lái)檢索服務(wù)實(shí)例的。
我們可以使用 HttpContext 類的 RequestServices 屬性來(lái)檢索 IServiceProvider 類型的實(shí)例,然后使用該實(shí)例調(diào)用 GetService 方法。
以下代碼展示了HttpContext 類如何做到檢索實(shí)例:
ICustomFileLogger logger = (ICustomFileLogger)HttpContext.RequestServices.GetService(typeof(ICustomFileLogger));
總結(jié)
依賴性注入是一種通過放松耦合來(lái)增強(qiáng)代碼維護(hù)和可測(cè)試性的方法。
我們可以使用 ASP.NET Core 中內(nèi)置的依賴注入支持來(lái)創(chuàng)建模塊化、精簡(jiǎn)和干凈的應(yīng)用程序,同時(shí)也使應(yīng)用程序更容易維護(hù)和測(cè)試。
參考資料:
以上就是ASP.NET Core中的依賴問題解決方法示例的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core依賴解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 沒有動(dòng)態(tài)的數(shù)組,可以用arraylist或list取代
C#里沒有動(dòng)態(tài)的數(shù)組,只能用arraylist或list取代。2009-06-06
ASP.NET?Core?6.0?添加?JWT?認(rèn)證和授權(quán)功能
這篇文章主要介紹了ASP.NET?Core?6.0?添加?JWT?認(rèn)證和授權(quán),本文將分別介紹?Authentication(認(rèn)證)?和?Authorization(授權(quán)),通過實(shí)例代碼分別介紹了這兩個(gè)功能,需要的朋友可以參考下2022-04-04
asp.net實(shí)現(xiàn)取消頁(yè)面表單內(nèi)文本輸入框Enter響應(yīng)的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)取消頁(yè)面表單內(nèi)文本輸入框Enter響應(yīng)的方法,結(jié)合實(shí)例形式分析了asp.net文本框Enter響應(yīng)的原理與取消Enter響應(yīng)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
在jquery repeater中添加設(shè)置日期,下拉,復(fù)選框等控件
JQueryElement 更新到了 3.5.1, 今天給大家主要講下如何在 Repeater 的模板中添加設(shè)置一些控件.2011-10-10
在AspNetCore中使用極驗(yàn)做行為認(rèn)證的驗(yàn)證流程
這篇文章主要介紹了在AspNetCore中使用極驗(yàn)做行為認(rèn)證的驗(yàn)證流程 ,本文有圖文介紹有實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Asp.Net MVC4通過id更新表單內(nèi)容的思路詳解
一個(gè)表單一旦創(chuàng)建完,其中大部分的字段便不可再編輯。只能編輯其中部分字段。下面通過本文給大家分享Asp.Net MVC4通過id更新表單內(nèi)容的思路詳解,需要的朋友參考下吧2017-07-07
ASP.NET Core開發(fā)教程之Logging利用NLog寫日志文件
一直很喜歡 NLog 的簡(jiǎn)潔和擴(kuò)展性,所以下面這篇文章主要給大家介紹了關(guān)于ASP.NET Core開發(fā)教程之Logging利用NLog寫日志文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
ASP.NET使用Subtract方法獲取兩個(gè)日期之間的天數(shù)
本節(jié)主要介紹了ASP.NET使用Subtract方法獲取兩個(gè)日期之間的天數(shù),需要的朋友可以參考下2014-08-08

