為什麼要使用依賴關係圖?
若要確保程式碼不會與其設計衝突,請在 Visual Studio 中使用相依性圖表驗證您的程式碼。 這可以幫助您:
尋找程式碼中的相依性與相依性圖上的相依性之間的衝突。
尋找可能受建議變更影響的相依性。
例如,您可以編輯相依性圖表以顯示潛在的架構變更,然後驗證程式碼以查看受影響的相依性。
重構程式碼或移轉至不同的設計。
尋找當您將程式碼移至不同架構時需要工作的程式碼或相依性。
要求
Visual Studio
若要建立 .NET Core 專案的相依性圖表,您必須具有 Visual Studio 2019 16.2 版或更新版本。
具有具有相依關係圖的建模專案的解決方案。 此相依性圖表必須連結至您要驗證的 C# 或 Visual Basic 專案中的成品。 請參閱 從程式碼建立相依性圖表。
若要查看哪些版本的 Visual Studio 支援此功能,請參閱 架構和模型化工具的版本支援。
您可以從 Visual Studio 中開啟的相依性圖表或命令提示字元手動驗證程式碼。 您也可以在執行本機組建或 Azure Pipelines 組建時自動驗證程式代碼。
這很重要
如果您想要使用 Team Foundation Server (TFS) 執行層驗證,您也必須在組建伺服器上安裝相同版本的 Visual Studio。
即時相依性驗證
相依性驗證會即時進行,錯誤會立即顯示在 錯誤清單中。
C# 和 Visual Basic 支援即時驗證。
若要在使用即時相依性驗證時啟用完整解決方案分析,請從「 錯誤清單」中顯示的金條開啟選項設定。
- 如果您不想查看解決方案中的所有架構問題,您可以永久關閉金條。
- 如果您未啟用完整解決方案分析,則只會針對正在編輯的檔案進行分析。
升級專案以啟用即時驗證時,對話方塊會顯示轉換進度。
更新專案以進行即時相依性驗證時,NuGet 套件的版本會升級為所有專案的相同版本,而且是使用的最高版本。
新增相依性驗證專案會觸發專案更新。
查看項目是否支援驗證
您可以將圖層連結至網站、Office 文件、純文字檔案,以及跨多個應用程式共用的專案中的檔案,但驗證程序不會包含這些檔案。 如果這些圖層之間沒有出現相依性,則不會針對連結至個別圖層的專案或組合的參考出現驗證錯誤。 除非程式碼使用這些參考,否則這類參考不會被視為相依性。
在相依性圖表上,選取一或多個圖層,以滑鼠右鍵按一下您的選取範圍,然後按一下 [檢視連結]。
在 「圖層總管」中,查看 「支撐驗證」欄。 如果值為 false,則項目不支援驗證。
包含其他 .NET 元件和專案以進行驗證
當您將項目拖曳至相依性圖表時,對應 .NET 元件或專案的參考會自動新增至模型化專案中的 [圖層參考] 資料夾。 此資料夾包含驗證期間分析的組件與專案的參考。 您可以包含其他 .NET 元件和專案進行驗證,而不需要手動將它們拖曳至相依性圖表。
在 [方案總管] 中,以滑鼠右鍵按一下模型專案或 [圖層參考 ] 資料夾,然後按一下 [新增參考]。
在 [ 新增參考 ] 對話方塊中,選取組件或專案,然後按一下 [ 確定]。
手動驗證程式碼
如果您有連結至解決方案專案的開啟相依性圖表,您可以從圖表執行 [驗證] 捷徑命令。 您也可以使用命令提示字元來執行 msbuild 命令,並將 /p:ValidateArchitecture 自訂屬性設定為 True。 例如,當您在程式碼中進行變更時,請定期執行層驗證,以便及早發現相依性衝突。
從開啟的相依性圖表驗證程式碼
以滑鼠右鍵按一下圖表介面,然後按一下 [驗證架構]。
備註
依預設,相依性圖表 (.layerdiagram) 檔案上的 「建置動作」 內容會設定為 「驗證」 ,以便將圖表包含在驗證程序中。
「 錯誤清單」視窗會 報告發生的任何錯誤。 如需驗證錯誤的詳細資訊,請參閱 疑難排解層驗證問題。
若要檢視每個錯誤的來源,請按兩下「 錯誤清單」 視窗中的錯誤。
備註
Visual Studio 可能會顯示程式代碼對應,而不是錯誤的來源。 當程式碼對相依性圖表未指定的元件具有相依性,或程式碼缺少相依性圖表所指定的相依性時,就會發生這種情況。 檢閱程式碼對應或程式碼,以判斷相依性是否應該存在。 如需關於程式碼地圖的更多資訊,請參閱在解決方案中對應相依性。
若要管理錯誤,請參閱 解決圖層驗證錯誤。
在命令提示字元中驗證程式碼
開啟 Visual Studio 命令提示字元。
請選擇下列一項:
若要針對解決方案中的特定模型化專案驗證程式碼,請使用下列自訂屬性執行 MSBuild。
msbuild <FilePath+ModelProjectFileName>.modelproj /p:ValidateArchitecture=true-或-
瀏覽至包含模型化專案 (.modelproj) 檔案和相依性圖表的資料夾,然後使用下列自訂屬性執行 MSBuild:
msbuild /p:ValidateArchitecture=true若要針對解決方案中的所有模型化專案驗證程式碼,請使用下列自訂屬性執行 MSBuild:
msbuild <FilePath+SolutionName>.sln /p:ValidateArchitecture=true-或-
流覽至解決方案資料夾,其中必須包含包含相依性圖表的模型化專案,然後使用下列自訂屬性執行 MSBuild:
msbuild /p:ValidateArchitecture=true將列出發生的任何錯誤。 如需 MSBuild 的詳細資訊,請參閱 MSBuild 和 MSBuild 工作。
如需驗證錯誤的詳細資訊,請參閱 疑難排解層驗證問題。
管理驗證錯誤
在開發過程中,您可能想要在驗證期間抑制部分報告中的衝突。 例如,您可能想要隱藏已解決或與您的特定案例無關的錯誤。 當您抑制錯誤時,建議在 Team Foundation 中記錄工作專案。
警告
您必須已連線到 TFS 原始程式碼控制 (SCC) ,才能建立或連結至工作專案。 如果您嘗試開啟與不同 TFS SCC 的連線,Visual Studio 會自動關閉目前的解決方案。 在嘗試建立或鏈結至工作項目之前,請確定您已連線到適當的 SCC。 在較新版本的 Visual Studio 中,如果您未連線到 SCC,則無法使用功能表命令。
建立一個與驗證錯誤相關的工作專案
- 在 [錯誤清單] 視窗中,以滑鼠右鍵按一下錯誤,指向 [ 建立工作專案],然後按一下您要建立的工作專案類型。
使用下列作業來管理 「錯誤清單」 視窗中的驗證錯誤:
| 至 | 按著這些次序 |
|---|---|
| 在驗證期間隱藏選取的錯誤 | 以滑鼠右鍵按一下一或多個選取的錯誤,指向 [管理驗證錯誤],然後按一下 [抑制錯誤]。 隱藏的錯誤會以刪除線格式顯示。 下次執行驗證時,不會出現這些錯誤。 已抑制的錯誤會在對應的相依性圖示檔案中的 .suppressions 檔案中被追蹤。 |
| 停止隱藏選取的錯誤 | 以滑鼠右鍵按一下選取的隱藏錯誤,指向 [管理驗證錯誤],然後按一下 [停止隱藏錯誤]。 您下次執行驗證時,將會出現選取的隱藏錯誤。 |
| 還原「 錯誤清單」 視窗中所有隱藏的錯誤 | 以滑鼠右鍵按一下 [錯誤清單] 視窗中的任何位置,指向 [管理驗證錯誤],然後按一下 [ 顯示所有隱藏的錯誤]。 |
| 從 「錯誤清單」 視窗隱藏所有隱藏的錯誤 | 以滑鼠右鍵按一下 [錯誤清單 ] 視窗中的任何位置,指向 [管理驗證錯誤],然後按一下 [隱藏所有隱藏的錯誤]。 |
自動驗證程式碼
您可以在每次執行本機建置時執行圖層驗證。 如果您的團隊使用 Azure DevOps,您可以使用閘道式簽入來執行層驗證,並且透過建立自訂 MSBuild 工作來加以指定,並使用建置報告來收集驗證錯誤。 若要建立閘道簽入組建,請參閱 TFVC 閘道簽入。
在本機組建期間自動驗證程式碼
使用文字編輯器開啟建模專案 (.modelproj) 檔案,然後包含下列屬性:
<ValidateArchitecture>true</ValidateArchitecture>
- 或 -
在 [方案總管] 中,以滑鼠右鍵按一下包含相依性圖表的模型化專案,然後按一下 [屬性]。
在 [內容] 視窗中,將模型化專案的 [驗證架構 ] 內容設定為 True。
這包括驗證過程中的建模專案。
在 [方案總管] 中,按一下您要用於驗證的相依性圖表 (.layerdiagram) 檔案。
在 [屬性] 視窗中,確定圖表的 [建置動作 ] 屬性已設定為 [驗證]。
這包括驗證過程中的依賴關係圖。
若要管理「錯誤清單」視窗中的錯誤,請參閱解決 圖層驗證錯誤。
疑難排解圖層驗證問題
下表說明圖層驗證問題及其解決方案。 這些問題與程式碼與設計之間衝突所導致的錯誤不同。 如需這些錯誤的詳細資訊,請參閱 疑難排解層驗證問題。
| Issue | 可能的原因 | Resolution |
|---|---|---|
| 驗證錯誤未如預期發生。 | 驗證不適用於從方案總管中其他相依性圖表複製的相依性圖表,且位於相同模型化專案中的相依性圖表。 以這種方式複製的相依關係圖包含與原始相依關係圖相同的參照。 | 將新的相依關係圖新增至建模專案。 將元素從來源相依性圖表複製到新圖表。 |
解決圖層驗證錯誤
當您根據相依性圖表驗證程式碼時,當程式碼與設計衝突時,就會發生驗證錯誤。 例如,下列條件可能會導致驗證錯誤發生:
構件被指派到錯誤的圖層。 在此情況下,請移動構件。
構件 (例如類別) 會以與您的架構衝突的方式使用另一個類別。 在此情況下,請重構程式碼以移除相依性。
若要解決這些錯誤,請更新程式碼,直到驗證期間不再出現錯誤為止。 您可以以反覆的方式執行此作業。
下一節說明這些錯誤中使用的語法、說明這些錯誤的意義,並建議您可以採取哪些措施來解決或管理這些錯誤。
| Syntax | 說明 |
|---|---|
| ArtifactN(ArtifactTypeN) |
ArtifactN 是與相依關係圖上的層相關聯的構件。 ArtifactTypeN 是 ArtifactN 的類型,例如 類別 或 方法,例如: MySolution.MyProject.MyClass.MyMethod(Method) |
| 命名空間名稱N | 命名空間的名稱。 |
| 層名稱N | 相依性圖表上層的名稱。 |
| 相依性類型 | Artifact1 與 Artifact2 之間的相依關係類型。 例如,Artifact1 與 Artifact2 具有 Calls 關聯性。 |
| 錯誤語法 | 錯誤描述 |
|---|---|
| DV0001: 無效的相依性 | 當對應至層的程式碼元素 (命名空間、類型、成員) 參考對應至另一個層的程式碼元素,但在包含此層的相依性驗證圖表中,這些層之間沒有相依性箭號時,就會報告此問題。 這是相依性限制違規。 |
| DV1001: 命名空間名稱無效 | 此問題報告在一個程式碼元素上,該元素與一個屬性名為「允許的命名空間名稱」的圖層相關聯,但該屬性不包含定義此程式碼元素的命名空間。 這是命名條件約束違規。 請注意,「允許的命名空間名稱」的語法是命名空間的分號清單,其中允許定義與層相關聯的程式碼元素。 |
| DV1002: 相依於無法參考的命名空間 | 此問題是在與圖層相關聯的程式碼元素上報告的,該元素參考了另一個在命名空間中定義的程式碼元素,而該命名空間被定義在該圖層的「無法參考命名空間」屬性中。 這是命名條件約束違規。 請注意,「不可參考的命名空間」屬性定義為以分號分隔的命名空間清單,不應在此層相關聯的程式碼元素中引用這些名稱空間。 |
| DV1003: 不允許的命名空間名稱 | 此問題是在與圖層相關聯的程式碼元素上報告的,而此圖層的「不允許的命名空間名稱」屬性包含了定義此程式碼元素的命名空間。 這是命名條件約束違規。 請注意,「不允許的命名空間名稱」屬性定義為以分號分隔的命名空間清單,其中不應定義與此層相關聯的程式碼元素。 |
| DV2001:層圖存在性 | 此問題是在不包含相依性圖表檔案但參考相依性驗證分析器的專案上報告的。 如果尚未使用相依性驗證,您可以直接從方案總管移除 「Microsoft.DependencyValidation.Analyzers」,或隱藏此警告。 若要新增相依性圖表,請參閱 從程式碼建立相依性圖表。 |
| DV2002: 未對應的類型基底 | 當程式碼元素未對應至任何層時,就會報告此問題。 |
| DV3001: 缺少連結 | 圖層 'LayerName' 連結到找不到的 'Artifact'。 您是否缺少組合參考? |
| DV9001: 架構分析發現內部錯誤 | 結果可能不完整。 如需詳細資訊,請參閱詳細的建置事件記錄檔或輸出視窗。 |