中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在ASP.NET Core中編寫高效的控制器

發布時間:2021-07-19 10:23:29 來源:億速云 閱讀:178 作者:chen 欄目:編程語言

這篇文章主要講解了“怎么在ASP.NET Core中編寫高效的控制器”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么在ASP.NET Core中編寫高效的控制器”吧!

通過遵循最佳實踐,可以編寫更好的控制器。所謂的“瘦”控制器(指代碼更少、職責更少的控制器)更容易閱讀和維護。而且,一旦你的控制器很瘦,可能就不需要對它們進行太多測試了。相反,你可以專注于測試業務邏輯和數據訪問代碼。瘦控制器的另一個優點是,它更容易維護控制器的多個版本。

這篇文章討論了使控制器變胖的壞習慣,然后探索了使控制器變瘦和易于管理的方法。我列出編寫控制器的最佳實踐可能并不全面,但我已經討論了最重要的一些,并在適當的情況下提供了相關的源代碼。在接下來的幾節中,我們將研究什么是胖控制器,為什么它是一種代碼壞味道,瘦控制器是什么,為什么它是有益的,以及如何使控制器瘦、簡單、可測試和可管理。

從控制器中刪除數據訪問代碼

在編寫控制器時,你應該堅持單一責任原則,這意味著控制器應該有“一個責任”或“有且只有一個原因可以更改”。換句話說,你希望將更改控制器代碼的原因減至最少。下面的代碼顯示了具有數據訪問邏輯的典型控制器。

在.NET生態系統中使用特定的技術堆棧會產生一些困惑,因為有很多選擇,比如應該使用哪種類型的運行時?在這篇文章中,我們將試圖把這些要點都說清楚。

public class AuthorController : Controller{    private AuthorContext dataContext = new AuthorContext();    public ActionResult Index(int authorId)    {        var authors = dataContext.Authors            .OrderByDescending(x=>x.JoiningDate)            .Where(x=>x.AuthorId == authorId)            .ToList();        return View(authors);    }}

在action內部使用數據上下文實例讀取數據,違反了單一職責原則,并使你的控制器充斥著不應該出現在那里的代碼。在本例中,我們使用一個DataContext(假設我們使用Entity Framework Core)來連接、處理數據庫中的數據。

明天如果你決定更改數據訪問技術(為了更好的性能或其他原因),你也必須更改你的控制器。例如,如果我想使用Dapper連接到底層數據庫該怎么辦?更好的方法是使用repository類來封裝數據訪問邏輯(盡管我不太喜歡repository模式)。讓我們用以下代碼更新AuthorController。

public class AuthorController : Controller{    private AuthorRepository authorRepository = new AuthorRepository();    public ActionResult Index(int authorId)    {        var authors = authorRepository.GetAuthor(authorId);        return View(authors);    }}

控制器現在看起來更瘦了。那么這是編寫這個控制器的最佳方法嗎?不是。如果你的控制器正在訪問數據訪問組件,那么它將做太多的事情,因此違反了單一職責原則。控制器不應該有直接訪問數據訪問組件的數據訪問邏輯或代碼。下面是AuthorController類的改進版本。

public class AuthorController : Controller{    private AuthorService authorService = new AuthorService();    public ActionResult Index(int authorId)    {        var authors = authorService.GetAuthor(authorId);        return View(authors);    }}

AuthorService類利用AuthorRepository類執行CRUD操作。

public class AuthorService{    private AuthorRepository authorRepository = new AuthorRepository();    public Author GetAuthor (int authorId)    {        return authorRepository.GetAuthor(authorId);    }}

避免編寫樣板代碼來映射對象

你經常需要映射數據傳輸對象(DTO)和域對象,反之亦然。請參考下面給出的代碼片段,它顯示了控制器方法內部的映射邏輯。

public IActionResult GetAuthor(int authorId){    var author = authorService.GetAuthor(authorId);    var authorDTO = new AuthorDTO();    authorDTO.AuthorId = author.AuthorId;    authorDTO.FirstName = author.FirstName;    authorDTO.LastName = author.LastName;    authorDTO.JoiningDate = author.JoiningDate; }

你不應該在控制器中編寫這樣的映射邏輯,因為它會使控制器膨脹并增加額外的責任。如果你要編寫映射邏輯,可以利用像AutoMapper這樣的對象映射器工具來避免編寫大量樣板代碼。

最后,你應該將映射邏輯移到前面創建的服務類中。注意AutoMapper是如何被用來映射兩個不兼容的類型Author和AuthorDTO的。

public class AuthorService{    private AuthorRepository authorRepository = new AuthorRepository();    public AuthorDTO GetAuthor (int authorId)    {        var author = authorRepository.GetAuthor(authorId);        return Mapper.Map<AuthorDTO>(author);    }}

避免在控制器中編寫業務邏輯代碼

不應該在控制器中編寫業務邏輯或驗證邏輯。控制器應該只接受一個請求,然后跳轉下一個action,除此之外沒有其他的。所有的業務邏輯代碼都應該轉移到其他類中(比如我們前面創建的AuthorService類)。有幾種方法可以在請求管道中設置驗證器,而不要在控制器中編寫驗證邏輯。這會使你的控制器變得不必要的臃腫,并讓它負責它不應該做的任務。

更喜歡依賴注入而不是組合

你應該更喜歡在控制器中使用依賴項注入來管理依賴項。依賴注入是控制反轉(IoC)原則的一個子集。它用于通過允許從外部注入的依賴項刪除內部依賴項。

通過利用依賴注入,你不必關心對象的實例化、初始化等。你可以有一個返回所需類型實例的工廠,然后可以使用構造函數注入來使用該實例。下面的代碼片段說明了如何使用構造函數將IAuthorService類型的實例注入到AuthorController。(假設IAuthorService是AuthorService類擴展的接口。)

public class AuthorController : Controller{    private IAuthorService authorService = new AuthorService();    public AuthorController(IAuthorService authorService)    {       this.authorService = authorService;    }}

使用action過濾器來消除重復的代碼

可以在asp.net core中使用action過濾器在請求管道中的特定點執行定制代碼。例如,你可以使用action過濾器在操作action方法執行之前和之后執行自定義代碼。你可以從控制器的action方法中刪除驗證邏輯,并將其寫入action過濾器中,而不是在控制器中編寫驗證邏輯。下面的代碼片段顯示了如何實現這一點。

[ValidateModelState][HttpPost]public ActionResult Create(AuthorRequest request){    AuthorService authorService = new AuthorService();    authorService.Save(request);    return RedirectToAction("Home");}

你將多個職責分配給了一個控制器,那么也會有多個原因導致控制器更改。因此,這違反了單一責任原則,該原則規定類應該有且只有一個變更的理由。

感謝各位的閱讀,以上就是“怎么在ASP.NET Core中編寫高效的控制器”的內容了,經過本文的學習后,相信大家對怎么在ASP.NET Core中編寫高效的控制器這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙州县| 衢州市| 尖扎县| 伊通| 福贡县| 依兰县| 内黄县| 开平市| 连平县| 永仁县| 顺平县| 泗水县| 湛江市| 泰顺县| 九寨沟县| 永德县| 田林县| 沁源县| 进贤县| 昌邑市| 南和县| 鄱阳县| 蒙阴县| 炎陵县| 鱼台县| 汝州市| 绥化市| 彰武县| 高安市| 句容市| 辛集市| 彰化县| 开远市| 灯塔市| 沭阳县| 那坡县| 达尔| 永定县| 宜宾县| 林西县| 咸宁市|