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

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

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、仲巴網(wǎng)絡(luò)推廣、小程序開發(fā)、仲巴網(wǎng)絡(luò)營銷、仲巴企業(yè)策劃、仲巴品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供仲巴建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:bm7419.com

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

這篇文章討論了使控制器變胖的壞習(xí)慣,然后探索了使控制器變瘦和易于管理的方法。我列出編寫控制器的最佳實(shí)踐可能并不全面,但我已經(jīng)討論了最重要的一些,并在適當(dāng)?shù)那闆r下提供了相關(guān)的源代碼。在接下來的幾節(jié)中,我們將研究什么是胖控制器,為什么它是一種代碼壞味道,瘦控制器是什么,為什么它是有益的,以及如何使控制器瘦、簡(jiǎn)單、可測(cè)試和可管理。

從控制器中刪除數(shù)據(jù)訪問代碼

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

在.NET生態(tài)系統(tǒng)中使用特定的技術(shù)堆棧會(huì)產(chǎn)生一些困惑,因?yàn)橛泻芏噙x擇,比如應(yīng)該使用哪種類型的運(yùn)行時(shí)?在這篇文章中,我們將試圖把這些要點(diǎn)都說清楚。

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內(nèi)部使用數(shù)據(jù)上下文實(shí)例讀取數(shù)據(jù),違反了單一職責(zé)原則,并使你的控制器充斥著不應(yīng)該出現(xiàn)在那里的代碼。在本例中,我們使用一個(gè)DataContext(假設(shè)我們使用Entity Framework Core)來連接、處理數(shù)據(jù)庫中的數(shù)據(jù)。

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

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

控制器現(xiàn)在看起來更瘦了。那么這是編寫這個(gè)控制器的最佳方法嗎?不是。如果你的控制器正在訪問數(shù)據(jù)訪問組件,那么它將做太多的事情,因此違反了單一職責(zé)原則??刂破鞑粦?yīng)該有直接訪問數(shù)據(jù)訪問組件的數(shù)據(jù)訪問邏輯或代碼。下面是AuthorController類的改進(jìn)版本。

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

AuthorService類利用AuthorRepository類執(zhí)行CRUD操作。

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

避免編寫樣板代碼來映射對(duì)象

你經(jīng)常需要映射數(shù)據(jù)傳輸對(duì)象(DTO)和域?qū)ο?,反之亦然。?qǐng)參考下面給出的代碼片段,它顯示了控制器方法內(nèi)部的映射邏輯。

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; }

你不應(yīng)該在控制器中編寫這樣的映射邏輯,因?yàn)樗鼤?huì)使控制器膨脹并增加額外的責(zé)任。如果你要編寫映射邏輯,可以利用像AutoMapper這樣的對(duì)象映射器工具來避免編寫大量樣板代碼。

最后,你應(yīng)該將映射邏輯移到前面創(chuàng)建的服務(wù)類中。注意AutoMapper是如何被用來映射兩個(gè)不兼容的類型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);    }}

避免在控制器中編寫業(yè)務(wù)邏輯代碼

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

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

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

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

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

使用action過濾器來消除重復(fù)的代碼

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

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

你將多個(gè)職責(zé)分配給了一個(gè)控制器,那么也會(huì)有多個(gè)原因?qū)е驴刂破鞲?。因此,這違反了單一責(zé)任原則,該原則規(guī)定類應(yīng)該有且只有一個(gè)變更的理由。

感謝各位的閱讀,以上就是“怎么在ASP.NET Core中編寫高效的控制器”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么在ASP.NET Core中編寫高效的控制器這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

本文名稱:怎么在ASP.NETCore中編寫高效的控制器
轉(zhuǎn)載注明:http://bm7419.com/article0/jcieio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站制作、網(wǎng)站營銷、云服務(wù)器自適應(yīng)網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司