自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何避免ASP .NET Core中的冗余DI代碼?

譯文
開(kāi)發(fā) 前端
本文講述如何利用基本控制器避免ASP.NET Core MVC中的依賴項(xiàng)注入代碼重復(fù),并強(qiáng)制執(zhí)行DRY原則。

[[408187]]

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

本文著重介紹DI代碼冗余,并介紹如何構(gòu)建自定義基本控制器以避免此類問(wèn)題。要使用本文中提供的代碼示例,應(yīng)該在系統(tǒng)中安裝Visual Studio 2019。如果您還沒(méi)有安裝,可以在此處下載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)證類型”處于“無(wú)”(默認(rèn))的狀態(tài)。

9. 確保“啟用Docker”、“為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)目來(lái)處理依賴項(xiàng)注入。

現(xiàn)在按照下面列出的步驟,在您的項(xiàng)目中創(chuàng)建額外控制器。

1. 鼠標(biāo)右擊控制器解決方案文件夾。

2. 選擇添加 -> 控制器。

3. 在“添加新腳手架項(xiàng)”對(duì)話框中,選擇API作為模板(默認(rèn)情況下將選擇MVC)。

4. 選擇“具有讀/寫(xiě)操作的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í)行它。無(wú)論何時(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類。接下來(lái),我們將創(chuàng)建基本控制器的實(shí)現(xiàn)。我們的基本控制器類將擴(kuò)展框架的ControllerBase 類。

這是我們將在該示例中使用的實(shí)體類:

  1. public class Order 
  2.     { 
  3.         public int Id { get; set; } 
  4.         public int CustomerId { get; set; } 
  5.         public string Address { get; set; }        
  6.     } 

現(xiàn)在創(chuàng)建一個(gè)名為IOrderManager的下列接口,含有ProcessOrder方法的聲明。

  1. public interface IOrderManager 
  2.     { 
  3.         public void ProcessOrder(Order order); 
  4.     } 

接下來(lái)創(chuàng)建擴(kuò)展IOrderManager接口,并實(shí)現(xiàn)ProcessOrder方法的OrderManager類。

  1. public class OrderManager : IOrderManager 
  2.    public void ProcessOrder(Order order
  3.    { 
  4.       throw new System.NotImplementedException(); 
  5.    } 

下列代碼片段顯示了您如何通過(guò)從ControllerBase類中推導(dǎo)來(lái)創(chuàng)建基本控制器類。

  1. [Route("api/[controller]")] 
  2. [ApiController] 
  3. public class BaseController : ControllerBase 
  4.    protected readonly ILogger<BaseController> _logger; 
  5.    protected readonly IOrderManager _orderManager; 
  6.    public BaseController(ILogger<BaseController> logger, 
  7.    IOrderManager orderManager) 
  8.    { 
  9.        _logger = logger; 
  10.        _orderManager = orderManager; 
  11.    } 

ASP.NET Core中擴(kuò)展自定義基本控制器

現(xiàn)在您可以創(chuàng)建控制器,只需從我們剛創(chuàng)建的這個(gè)自定義基本控制器來(lái)推導(dǎo)。下列代碼片段表明了您如何通過(guò)剛創(chuàng)建的基本控制器類加以擴(kuò)展來(lái)創(chuàng)建控制器類。

  1. [Route("api/[controller]")] 
  2. [ApiController] 
  3. public class OrderController : BaseController 
  4.    private readonly ILogger<OrderController> _logger; 
  5.   [HttpGet] 
  6.    public string Get() 
  7.    { 
  8.        return "OrderController"
  9.    } 
  10.    [HttpPost] 
  11.    public void ProcessOrder(Order order
  12.    { 
  13.       _orderManager.ProcessOrder(order); 
  14.    } 

然而,您會(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ò)展類的目的。

要解決此問(wèn)題,您可以利用HttpContext.RequestServices.GetService擴(kuò)展方法。記住,如果您試圖在控制器的構(gòu)造函數(shù)中訪問(wèn)HttpContext實(shí)例,該實(shí)例將為null。

作為ASP.NET Core請(qǐng)求的一部分而存在的服務(wù)可通過(guò)HttpContext.RequestServices集合來(lái)訪問(wèn)。這意味著當(dāng)您請(qǐng)求服務(wù)時(shí),將從該集合解析請(qǐng)求。

將HttpContext添加到ASP.NET Core中的基本控制器類

這是我們的BaseController 類的更新后源代碼。

  1. public abstract class BaseController<T> : ControllerBase where T : BaseController<T> 
  2.   private ILogger<T> _logger; 
  3.   protected ILogger<T> Logger => _logger ?? (_logger = HttpContext.RequestServices.GetService<ILogger<T>>());        

OrderController類擴(kuò)展這個(gè)抽象的BaseController類,如下面的代碼片段所示。

  1. [Route("api/[controller]")] 
  2. [ApiController] 
  3. public class OrderController : BaseController<OrderController> 
  4.     { 
  5.         private readonly IOrderManager _orderManager; 
  6.         public OrderController(IOrderManager orderManager) 
  7.         { 
  8.             _orderManager = orderManager; 
  9.         } 
  10.         [HttpGet] 
  11.         public string Get() 
  12.         { 
  13.             Logger.LogInformation("Hello World!"); 
  14.             return "Inside the Get method of OrderController"
  15.         } 
  16.         [HttpPost] 
  17.         public void ProcessOrder(Order order
  18.         { 
  19.             _orderManager.ProcessOrder(order); 
  20.         } 
  21.     } 

就是這樣!OrderController可利用Logger實(shí)例,并利用構(gòu)造函數(shù)注入來(lái)注入其他服務(wù)。

最后,記得將您的服務(wù)登記在Startup類的ConfigureServices方法中,所下所示:

  1. public void ConfigureServices(IServiceCollection services) 
  2.         { 
  3.             services.AddTransient<IOrderManager,OrderManager>(); 
  4.             services.AddControllersWithViews(); 
  5.         } 

最好使用參數(shù)化的構(gòu)造函數(shù)來(lái)解析依賴項(xiàng),比如通過(guò)使用構(gòu)造函數(shù)注入。這將幫助您創(chuàng)建更易于測(cè)試和維護(hù)的類。

原文標(biāo)題:How to avoid redundant DI code in ASP.NET Core,作者:Joydip Kanjilal

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2024-11-27 00:24:04

2019-11-08 08:00:00

ASP .NETASP .NET Cocookie

2021-02-19 06:54:33

配置系統(tǒng)ASP.NET Cor

2021-01-11 05:20:05

Controller代碼數(shù)據(jù)層

2021-03-04 11:10:29

容器化Docker虛擬機(jī)

2019-08-12 08:00:00

ASP.NetASP.Net Cor編程語(yǔ)言

2021-01-15 05:38:28

ASPHttp端口

2021-01-13 07:33:41

API數(shù)據(jù)安全

2021-03-08 07:32:05

Actionweb框架

2021-10-12 10:00:01

架構(gòu)機(jī)密數(shù)據(jù)

2021-01-05 07:51:06

版本化ASP

2021-01-31 22:56:50

FromServiceASP

2021-02-03 13:35:25

ASPweb程序

2021-03-03 22:37:16

MediatR中介者模式

2021-03-10 09:40:43

LamarASP容器

2021-02-28 20:56:37

NCache緩存框架

2021-01-28 22:39:35

LoggerMessa開(kāi)源框架

2021-01-07 07:39:07

工具接口 Swagger

2021-11-01 14:52:38

ElasticSear索引SQL

2021-03-17 09:45:31

LazyCacheWindows
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)