C# Web API 如何實踐MVC 實例
這篇文章不會寫詳細的程式碼,大概只是講一些概念,是我寫了幾個Web API以後找出最佳的單人玩家或多人合作實踐MVC方式,Model、View、Contorller三層基本的概念也會講一下。
MVC是啥?
MVC是什麼可以去問Skype的Bing,我這裡貼上GPT4的回答:
實作的時候要怎樣做?
可以想像Web API資料庫操作的時候進來的流程是像這樣:
API Controller->執行某段程式->存取資料庫->回報資料給API Controller->傳回JSON之類的。
API Controller是最不應該寫複雜的程式設計的(因為API Controller做Unit Test和整合測試最麻煩,通常省時間都用Postman測)。API Controller最合適做的是輸入輸出的正確性核對,與錯誤格式資料的回報訊息還有傳回正確的傳回值。
所以一開始程式設計根本不用管API Controller,這個在最後實踐就好,要做的是「執行某段程式」、「存取資料庫」、「回報資料給API Controller」,這三個最好都開一個專案來做單元測試和整合測試。
我這邊使用的不是EF Core做資料庫,我偏好Dapper因為他效能好又輕量。
Dapper做資料庫必備
首先我把Model層改定義,就是定義所有傳出(Response)、傳入(Request)、資料庫的結構(DbContext)的Class。所有要用到的物件開一個資料夾全部寫成Class,包含把一些傳回會共通的也合併。
比如要一個Topics的資料表查詢,首先會有TopicSelectRequest可能包含TopicId、Serach_Term,傳回的會是TopicDbContext,包含整個資料表的結構,用Dapper執行Query<TopicDbContext>讓他做Mapping。
這個程式要寫在哪,最好要有一層做資料的Select、Update、Insert、Delete,這層最好是要有詳細的各種的Test代碼確保未來改動都不會出錯。
這一層我就命名為DbManager(或簡稱Manager),也可以叫Operations,這個應該是在MVC裡面定義的Model原先定義的一層。
Manager層
Manager層可以做很多事情,我把這層定義為只要跟資料庫或者檔案系統(伺服器的FileSystem)有關都做在這一層,但這一層只要做基本的新增、查詢、刪除、更正,甚至包含改主索引,或者包含外部鍵值的連環刪除,甚至包含外部鍵值的更正主索引。
程式內建的資料搜尋功能也做在這一層,比如一個TopicSearchManager,包含了簡易搜尋、進階搜尋各種多載或者多個函數。傳入的型別都是在我定義的Model層界定好資料格式。這樣分開檔案比較好找,且比較好更改,尤其可以用[Required]之類的修飾詞來做Model層Request的Class。
檔案系統的操作,如果程式要讓人上傳檔案,這一層會包含了很多東西,比如FileToTextManager(把檔案內容文字放到資料庫供搜尋)、VideoConvertManager(把所有上傳的影片都用統一格式壓縮儲存),最後有一個FileManager可以確認檔案是否有重複?是否需要刪除不必要的檔案?是否有檔案丟失?然後由FileManager來CreateFile跟做Files在Database裡的紀錄連結。
這樣應該就很清楚,這層是關鍵,要寫一堆Tests來測試他們。
Domain層
我把整個View稱之為Domain層,這一層會是來做資料的詳細處理,然後回報給API Controller讓它直接回傳的。
Domain層會包含以下的內容,以Select為例:利用Manager層找到想要的資料,刪除一些不必要的資料或者做子表的查詢,最後把資料處理成Response的Class格式,最後傳回一個Response或多個Response給API Controller。
這一層也要寫很多測試,因為測試完,程式就完成一半了,另一半就是在前端如Angular上了。
Controller層
這一層一開始進來就要核對有沒有被攻擊的判斷,或者資料錯誤的判斷,各種Request的判斷都要做。
這一層一定是最後才會做的,因為寫Test比較難,要創建Request再傳給他們,有時會直接用Postman人工測試比較快。
代碼這一層是最簡單的,判斷之後,依照條件呼叫Domain,Domain呼叫Manager取出資料或者對資料做一些舉動。
最後可以同步化也可以非同步化傳回給Angular之類的前端框架用JSON的格式。
總結
這樣MVC架構,我把M拆成Model+Manager(兩個都是M字首的),然後View改成Domain層或者就乾脆叫View層,最後Controller維持Controller原本的用途和定義。
盡量用巢狀的資料夾結構將.cs的檔案歸檔,這樣很好找,檔名要取的很有意義,盡量不要兩個不同東西合併在一個檔案裡面。
這樣C# Web API MVC最基礎的一種實踐就完成了。