新聞中心
使用ASP.NET Core或ASP.NET Core MVC處理Web應(yīng)用程序中的控制器時(shí),您可能會(huì)遇到代碼冗余。比如說,可能遇到過使用依賴項(xiàng)注入(DI)來注入所需服務(wù)的控制器。如果注入依賴項(xiàng)的代碼在多個(gè)控制器中被重用,就存在代碼冗余,并違反DRY原則。

10余年的榮昌網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整榮昌建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“榮昌網(wǎng)站設(shè)計(jì)”,“榮昌網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
本文著重介紹DI代碼冗余,并介紹如何構(gòu)建自定義基本控制器以避免此類問題。要使用本文中提供的代碼示例,應(yīng)該在系統(tǒng)中安裝Visual Studio 2019。如果您還沒有安裝,可以在此處下載Visual Studio 2019。
Visual Studio中創(chuàng)建ASP.NET Core MVC項(xiàng)目
首先,不妨在Visual Studio 2019中創(chuàng)建一個(gè)ASP.NET Core項(xiàng)目。按照這些步驟將在 Visual Studio 2019中創(chuàng)建一個(gè)新的ASP.NET Core MVC項(xiàng)目。
1. 啟動(dòng)Visual Studio IDE。
2. 點(diǎn)擊“創(chuàng)建新項(xiàng)目”。
3. 在“創(chuàng)建新項(xiàng)目”窗口中,從顯示的模板列表中選擇“ASP.NET Core Web App (Model-View-Controller)”。
4. 點(diǎn)擊“下一步”。
5. 在“配置新項(xiàng)目”窗口中,指定新項(xiàng)目的名稱和位置。
6. 根據(jù)個(gè)人喜好,選擇性勾選“將解決方案和項(xiàng)目放在同一目錄中”復(fù)選框。
7. 點(diǎn)擊“下一步”。
8. 在隨后顯示的“額外信息”窗口中,從頂部的下拉列表中選擇.NET 5.0作為目標(biāo)框架。任由“身份驗(yàn)證類型”處于“無”(默認(rèn))的狀態(tài)。
9. 確?!皢⒂肈ocker”、“為HTTPS配置”和“啟用Razor運(yùn)行時(shí)編譯”等復(fù)選框未被勾選,因?yàn)槲覀儾粫?huì)在這里使用任何這些功能。
10. 點(diǎn)擊創(chuàng)建。
將創(chuàng)建一個(gè)新的ASP.NET Core MVC項(xiàng)目。我們將在本文的后續(xù)部分中使用這個(gè)項(xiàng)目來處理依賴項(xiàng)注入。
現(xiàn)在按照下面列出的步驟,在您的項(xiàng)目中創(chuàng)建額外控制器。
1. 鼠標(biāo)右擊控制器解決方案文件夾。
2. 選擇添加 -> 控制器。
3. 在“添加新腳手架項(xiàng)”對(duì)話框中,選擇API作為模板(默認(rèn)情況下將選擇MVC)。
4. 選擇“具有讀/寫操作的API控制器”這項(xiàng)。
5. 點(diǎn)擊添加。
6. 在隨后顯示的“添加新項(xiàng)”對(duì)話框中,為新控制器指定名稱。
7. 點(diǎn)擊添加。
ASP.NET Core中的內(nèi)置基本控制器類
控制器有兩個(gè)基本類,即ControllerBase和Controller。ControllerBase類實(shí)現(xiàn)IController 接口,并提供幾個(gè)方法和屬性的實(shí)現(xiàn)。它定義了一個(gè)名為ExecuteCore的抽象方法,用于定位操作方法并執(zhí)行它。無論何時(shí)構(gòu)建API,您都應(yīng)該使用ControllerBase。
Controller類擴(kuò)展了ControllerBase類,提供了ExecuteCore方法,并添加了可以在控制器類中使用的幾個(gè)方法,比如View()和Redirect()。與ControllerBase一樣,Controller 類是支持視圖的基本控制器類。因此,只要在ASP.NET Core MVC中創(chuàng)建控制器,都應(yīng)該使用Controller類。ControllerBase類提供了與路由和HttpContext的必要集成,以便您可以利用它們。它還含有管理ViewData和TempData所需的代碼。
ASP.NET Core中實(shí)現(xiàn)基本控制器類
我們?cè)贏SP.NET Core中創(chuàng)建新的API控制器類時(shí),它默認(rèn)擴(kuò)展ControllerBase類。接下來,我們將創(chuàng)建基本控制器的實(shí)現(xiàn)。我們的基本控制器類將擴(kuò)展框架的ControllerBase 類。
這是我們將在該示例中使用的實(shí)體類:
- public class Order
- {
- public int Id { get; set; }
- public int CustomerId { get; set; }
- public string Address { get; set; }
- }
現(xiàn)在創(chuàng)建一個(gè)名為IOrderManager的下列接口,含有ProcessOrder方法的聲明。
- public interface IOrderManager
- {
- public void ProcessOrder(Order order);
- }
接下來創(chuàng)建擴(kuò)展IOrderManager接口,并實(shí)現(xiàn)ProcessOrder方法的OrderManager類。
- public class OrderManager : IOrderManager
- {
- public void ProcessOrder(Order order)
- {
- throw new System.NotImplementedException();
- }
- }
下列代碼片段顯示了您如何通過從ControllerBase類中推導(dǎo)來創(chuàng)建基本控制器類。
- [Route("api/[controller]")]
- [ApiController]
- public class BaseController : ControllerBase
- {
- protected readonly ILogger
_logger; - protected readonly IOrderManager _orderManager;
- public BaseController(ILogger
logger, - IOrderManager orderManager)
- {
- _logger = logger;
- _orderManager = orderManager;
- }
- }
ASP.NET Core中擴(kuò)展自定義基本控制器
現(xiàn)在您可以創(chuàng)建控制器,只需從我們剛創(chuàng)建的這個(gè)自定義基本控制器來推導(dǎo)。下列代碼片段表明了您如何通過剛創(chuàng)建的基本控制器類加以擴(kuò)展來創(chuàng)建控制器類。
- [Route("api/[controller]")]
- [ApiController]
- public class OrderController : BaseController
- {
- private readonly ILogger
_logger; - [HttpGet]
- public string Get()
- {
- return "OrderController";
- }
- [HttpPost]
- public void ProcessOrder(Order order)
- {
- _orderManager.ProcessOrder(order);
- }
- }
然而,您會(huì)發(fā)現(xiàn)上述代碼不會(huì)編譯。以下是您會(huì)在Visual Studio中看到的錯(cuò)誤:
該錯(cuò)誤表明,您需要使用與BaseController類構(gòu)造函數(shù)相同的參數(shù)實(shí)現(xiàn)另一個(gè)參數(shù)構(gòu)造函數(shù)。但為什么?如果您要在擴(kuò)展所創(chuàng)建的基本控制器類的所有控制器中復(fù)制依賴項(xiàng)注入代碼,也就失去了擴(kuò)展類的目的。
要解決此問題,您可以利用HttpContext.RequestServices.GetService 擴(kuò)展方法。記住,如果您試圖在控制器的構(gòu)造函數(shù)中訪問HttpContext實(shí)例,該實(shí)例將為null。
作為ASP.NET Core請(qǐng)求的一部分而存在的服務(wù)可通過HttpContext.RequestServices集合來訪問。這意味著當(dāng)您請(qǐng)求服務(wù)時(shí),將從該集合解析請(qǐng)求。
將HttpContext添加到ASP.NET Core中的基本控制器類
這是我們的BaseController 類的更新后源代碼。
- public abstract class BaseController
: ControllerBase where T : BaseController - {
- private ILogger
_logger; - protected ILogger
Logger => _logger ?? (_logger = HttpContext.RequestServices.GetService >()); - }
OrderController類擴(kuò)展這個(gè)抽象的BaseController類,如下面的代碼片段所示。
- [Route("api/[controller]")]
- [ApiController]
- public class OrderController : BaseController
- {
- private readonly IOrderManager _orderManager;
- public OrderController(IOrderManager orderManager)
- {
- _orderManager = orderManager;
- }
- [HttpGet]
- public string Get()
- {
- Logger.LogInformation("Hello World!");
- return "Inside the Get method of OrderController";
- }
- [HttpPost]
- public void ProcessOrder(Order order)
- {
- _orderManager.ProcessOrder(order);
- }
- }
就是這樣!OrderController可利用Logger實(shí)例,并利用構(gòu)造函數(shù)注入來注入其他服務(wù)。
最后,記得將您的服務(wù)登記在Startup類的ConfigureServices方法中,所下所示:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddTransient
(); - services.AddControllersWithViews();
- }
最好使用參數(shù)化的構(gòu)造函數(shù)來解析依賴項(xiàng),比如通過使用構(gòu)造函數(shù)注入。這將幫助您創(chuàng)建更易于測試和維護(hù)的類。
標(biāo)題名稱:如何避免ASP.NETCore中的冗余DI代碼?
當(dāng)前URL:http://m.5511xx.com/article/cdoiedg.html


咨詢
建站咨詢
