Visual Studio 做 Net Core 專案分層
什麼是程式分層呢?在平常我們在大專案會做分層,讓程式不會特別亂。當然有些小專案不會這麼複雜,有些公司(優良)可能會用,但有些可能不會特別設定,但正常專案通常都會切。設定這個可能也需要一些編譯程式知識,新手不了解編譯程式相關知識可能會遇到很多問題,我推薦了解再回來看可能會比較懂在做什麼。
常見分層
MVC
常見的開發模式會切層Model
、View
、Controller
。這邊就不詳細介紹。我第一間公司有分這三層,但這三層寫久了會發現一個問題。Controller 那邊很多方法,寫久了會有後會覺得亂亂的。這時候會有一個概念 Service
,通常這個會用來處理商業一些邏輯用,可以讓你的程式共用。
詳細內容推薦看菜雞新訓記 (5): 使用 三層式架構 來切分服務的關注點和職責吧 | 伊果的沒人看筆記本這篇,有很多觀點我覺得作者講的很棒,算是講得滿細,滿多自己的觀點。但大部分方向都是一樣的,有些設計會不太一樣,很多人都不會提到 DTO,但我覺得可以了解 DTO 是做什麼用?可能很多專案 DTO 指的意思都是不一樣東西。
我覺得每個人都有各自想法,但這篇文章真的講滿多的,推薦可以看一下。畢竟我待過每家切的層都不太一樣,可能有些人分資料夾解決,有些會分 Package 再透過專案引入。
我覺得先會怎麼使用,在學要怎麼用才是重要的。不要照教學操作,結果設計不知道要怎麼做就不是很好。就像 GIT 會先學怎麼用,不會一開始去學 GIT Flow 流程。
Controller
層不能呼叫 Controller
Method,但是有些框架沒有這個問題。像我之前 PHP 框架 Controller
寫上商業邏輯,但是要呼叫之前寫的商業邏輯就沒辦法重複使用,因為 Controller
沒法直接呼叫 Controller Method。所以我認為拆 Service
也是很重要的一件事。DDD
- 展示層: Web MVC,Web API
- 應用層: 診對用戶場景、用例設計應用層服務,離底層細節。
- 領域層: 專注於維護業務規則
- 基處設施層:負責資料查詢和持久化
最近買中台架構與實現 - 基於 DDD 和微服務
書還沒看完,這邊就不說太多。
使用 dotnet cli 指令建立分層
發現最近 .Net 專案建置分層很不方便,剛好最近裝 cli 工具嘗試看看。
參考: Visual Studio解决方案中添加src文件夹的方法_vs怎么在解决方案添加文件夹_倾斜的水瓶座的博客-CSDN博客
- 建立方案資料夾
|
|
- 建立方案檔案
|
|
- 建立新的專案(Library)
|
|
- 方案加入新專案
|
|
接下來 reference project 可以參考dotnet add reference command - .NET CLI | Microsoft Learn。
快速產生 Controller 和 View 可以參考 如何使用 .NET CLI 快速產生 ASP․NET Core 的 Controllers 與 Views 程式碼 | The Will Will Web。
我覺得用 vsCode 好像沒有用 Visual Studio Code 方便。
Visual Studio 操作專案分層
開始新增另一個專案
這邊開始本篇重頭戲。其實只有兩個步驟。
參考:使用 Visual Studio 建立 .NET 類別庫 - .NET | Microsoft Docs
使用 Visual Studio Code 建立 .NET 類別庫 - .NET | Microsoft Docs
在主專案依賴另一個專案
管理專案中的參考 - Visual Studio (Windows) | Microsoft Docs
每次都會忘掉怎麼使用,這邊稍微紀錄。
- 專案下面
依賴性
右鍵(可參考下面圖片) - 新增專案參考
- 勾選剛剛新增要引入專案
- 確認就完成匯入
我們這邊發現一件事情,只要依賴別的專案過,其中依賴裡面還有再依賴別的專案,到主專案就不需要再依賴進去。
這邊舉例來說,假如 Web 有用到 Service,再到 Service 有依賴 Common, Web 就不需要再依賴
Common。就算你想點依賴,Visual Studio 也會提示你重複依賴,不給你點下去。這點跟 Java 不太一樣。
Java import 一些專案有分編譯時候
和執行時候
依賴專案來源。所以在有一些古老專案,老專案沒有使用 Maven 和 Gradle 管理工具去控制,但是在 Eclipse 可以手動去依賴,這時候我有看到很多專案都會做 import 動作。
舉個例子,假如 Web 有用到 Service ,再到 Service 有依賴 Common ,Web 還需再依賴 Common ,如果,Web沒依賴 Common 就會錯誤。
切層後的結果