日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何避免ASP.NETCore中的冗余DI代碼?

使用ASP.NET Core或ASP.NET Core MVC處理Web應用程序中的控制器時,您可能會遇到代碼冗余。比如說,可能遇到過使用依賴項注入(DI)來注入所需服務的控制器。如果注入依賴項的代碼在多個控制器中被重用,就存在代碼冗余,并違反DRY原則。

10余年的榮昌網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調整榮昌建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“榮昌網(wǎng)站設計”,“榮昌網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

本文著重介紹DI代碼冗余,并介紹如何構建自定義基本控制器以避免此類問題。要使用本文中提供的代碼示例,應該在系統(tǒng)中安裝Visual Studio 2019。如果您還沒有安裝,可以在此處下載Visual Studio 2019。

Visual Studio中創(chuàng)建ASP.NET Core MVC項目

首先,不妨在Visual Studio 2019中創(chuàng)建一個ASP.NET Core項目。按照這些步驟將在 Visual Studio 2019中創(chuàng)建一個新的ASP.NET Core MVC項目。

1. 啟動Visual Studio IDE。

2. 點擊“創(chuàng)建新項目”。

3. 在“創(chuàng)建新項目”窗口中,從顯示的模板列表中選擇“ASP.NET Core Web App (Model-View-Controller)”。

4. 點擊“下一步”。

5. 在“配置新項目”窗口中,指定新項目的名稱和位置。

6. 根據(jù)個人喜好,選擇性勾選“將解決方案和項目放在同一目錄中”復選框。

7. 點擊“下一步”。

8. 在隨后顯示的“額外信息”窗口中,從頂部的下拉列表中選擇.NET 5.0作為目標框架。任由“身份驗證類型”處于“無”(默認)的狀態(tài)。

9. 確?!皢⒂肈ocker”、“為HTTPS配置”和“啟用Razor運行時編譯”等復選框未被勾選,因為我們不會在這里使用任何這些功能。

10. 點擊創(chuàng)建。

將創(chuàng)建一個新的ASP.NET Core MVC項目。我們將在本文的后續(xù)部分中使用這個項目來處理依賴項注入。

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

1. 鼠標右擊控制器解決方案文件夾。

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

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

4. 選擇“具有讀/寫操作的API控制器”這項。

5. 點擊添加。

6. 在隨后顯示的“添加新項”對話框中,為新控制器指定名稱。

7. 點擊添加。

ASP.NET Core中的內置基本控制器類

控制器有兩個基本類,即ControllerBase和Controller。ControllerBase類實現(xiàn)IController 接口,并提供幾個方法和屬性的實現(xiàn)。它定義了一個名為ExecuteCore的抽象方法,用于定位操作方法并執(zhí)行它。無論何時構建API,您都應該使用ControllerBase。

Controller類擴展了ControllerBase類,提供了ExecuteCore方法,并添加了可以在控制器類中使用的幾個方法,比如View()和Redirect()。與ControllerBase一樣,Controller 類是支持視圖的基本控制器類。因此,只要在ASP.NET Core MVC中創(chuàng)建控制器,都應該使用Controller類。ControllerBase類提供了與路由和HttpContext的必要集成,以便您可以利用它們。它還含有管理ViewData和TempData所需的代碼。

ASP.NET Core中實現(xiàn)基本控制器類

我們在ASP.NET Core中創(chuàng)建新的API控制器類時,它默認擴展ControllerBase類。接下來,我們將創(chuàng)建基本控制器的實現(xiàn)。我們的基本控制器類將擴展框架的ControllerBase 類。

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

 
 
 
 
  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)建一個名為IOrderManager的下列接口,含有ProcessOrder方法的聲明。

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

接下來創(chuàng)建擴展IOrderManager接口,并實現(xiàn)ProcessOrder方法的OrderManager類。

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

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

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

ASP.NET Core中擴展自定義基本控制器

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

 
 
 
 
  1. [Route("api/[controller]")] 
  2. [ApiController] 
  3. public class OrderController : BaseController 
  4.    private readonly ILogger _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.    } 

然而,您會發(fā)現(xiàn)上述代碼不會編譯。以下是您會在Visual Studio中看到的錯誤:

該錯誤表明,您需要使用與BaseController類構造函數(shù)相同的參數(shù)實現(xiàn)另一個參數(shù)構造函數(shù)。但為什么?如果您要在擴展所創(chuàng)建的基本控制器類的所有控制器中復制依賴項注入代碼,也就失去了擴展類的目的。

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

作為ASP.NET Core請求的一部分而存在的服務可通過HttpContext.RequestServices集合來訪問。這意味著當您請求服務時,將從該集合解析請求。

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

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

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

OrderController類擴展這個抽象的BaseController類,如下面的代碼片段所示。

 
 
 
 
  1. [Route("api/[controller]")] 
  2. [ApiController] 
  3. public class OrderController : BaseController 
  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ù)注入來注入其他服務。

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

 
 
 
 
  1. public void ConfigureServices(IServiceCollection services) 
  2.         { 
  3.             services.AddTransient(); 
  4.             services.AddControllersWithViews(); 
  5.         } 

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


分享名稱:如何避免ASP.NETCore中的冗余DI代碼?
瀏覽路徑:http://www.5511xx.com/article/cdoiedg.html