使用圖層圖表驗證程式碼
若要,確定程式碼不衝突其設計,您可以驗證與圖層圖表的程式碼在 Visual Studio Ultimate、Visual Studio Premium。 這可協助您:
尋找相衝突相依性之間的程式碼,並在圖層的相依性圖表。
尋找可能會受到建議變更所影響的相依性。
例如,您可以編輯圖層圖表來顯示潛在的架構變更,然後驗證程式碼,以便查看受影響的相依性。
將程式碼重構或移轉至不同設計。
尋找要求工作的程式碼或相依性,當您將程式碼移至不同的結構時。
您可以手動驗證程式碼在 Visual Studio 中建立一個開啟的圖層圖表或從命令提示字元。 在執行本機組建或 Team Foundation Build,您也會自動驗證程式碼。 請 Channel 9 視訊:使用圖層圖表,設計和驗證您的結構參閱。
需求
Visual Studio Ultimate 或 Visual Studio Premium
具有圖層圖表的模型專案的方案。 必須與 Visual C# .NET 的成品連結這張圖層圖表或 Visual Basic .NET 預期要驗證。 請參閱 從程式碼建立圖層圖表。
若要
如需項目是否支援驗證
包含其他 .NET 組件和專案的驗證
以手動方式驗證程式碼
自動驗證程式碼
疑難排解圖層驗證問題。
了解並解決圖層驗證的錯誤
如需項目是否支援驗證
圖層圖表上,選取一個或多個圖層,以滑鼠右鍵按一下選取項目,然後按一下 [檢視連結。]。
在 [圖層總管] 中,查看 [支援驗證] 資料行。 如果值為 false,不支援驗證。
您可以連結到圖層網站, Office 文件和純文字檔,不過,驗證程序不會包含它們。 驗證錯誤不會顯示參考連接不同圖層的專案或組件的參考,當相依性不會出現在這些層之間。 除非程式碼使用這些參考,否則不會考量此類參考的相依性。
包含其他 .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 中記錄工作項目。
若要針對驗證錯誤建立工作項目
- 在 [錯誤清單] 視窗中,以滑鼠右鍵按一下警告、指向 [建立工作項目],然後按一下您要建立的工作項目類型。
使用下列工作來管理 [錯誤清單] 視窗中的驗證錯誤:
若要 |
請依照下列步驟: |
---|---|
在驗證期間隱藏選取的錯誤 |
以滑鼠右鍵按一下一個或多個選取的錯誤、指向 [管理驗證錯誤],然後按一下 [隱藏錯誤]。 隱藏的錯誤會以刪除線的格式出現。 當您下一次執行驗證時,這些錯誤將不會出現。 隱藏的錯誤會在對應圖層圖表檔案的 .suppressions 檔案中追蹤。 |
停止隱藏選取的錯誤 |
以滑鼠右鍵按一下一個或多個選取的隱藏錯誤、指向 [管理驗證錯誤],然後按一下 [停止隱藏錯誤]。 選取的隱藏錯誤將會在下一次執行驗證時出現。 |
在 [錯誤清單] 視窗中還原所有隱藏的錯誤 |
以滑鼠右鍵按一下 [錯誤清單] 視窗中的任何位置、指向 [管理驗證錯誤],然後按一下 [顯示所有隱藏的錯誤]。 |
在 [錯誤清單] 視窗中隱藏所有隱藏的錯誤 |
以滑鼠右鍵按一下 [錯誤清單] 視窗中的任何位置、指向 [管理驗證錯誤],然後按一下 [隱藏所有隱藏的錯誤]。 |
自動驗證程式碼
您可以在每次執行本機組建時執行圖層驗證。 如果您的小組使用 Team Foundation Build,執行圖層驗證與閘道簽入,您可以建立自訂 MSBuild 工作指定,並使用組建報告收集驗證錯誤。建立閘道簽入組建的詳細資訊,請參閱 定義閘道簽入建置流程來驗證變更。
在本機組建執行期間自動的驗證程式碼。
- 使用文字編輯器來開啟模型專案 (.modelproj) 檔案,然後加入下列屬性:
<ValidateArchitecture>true</ValidateArchitecture>
-或-
在 [方案總管] 中,以滑鼠右鍵按一下包含一個或多個圖層圖表的模型專案,然後按一下 [屬性]。
在 [屬性] 視窗中,將模型專案的 [驗證架構] 屬性設為 [True]。
這會將模型專案納入驗證程序中。
在 [方案總管] 中,按一下要用於驗證作業的圖層圖表 (.layerdiagram) 檔案。
在 [屬性] 視窗中,確定圖表的 [建置動作] 屬性已設為 [驗證]。
這會將圖層圖表納入驗證程序中。
若要處理在錯誤清單視窗中的錯誤,請參閱 管理驗證錯誤。
在 Team Foundation Build 執行期間來自動驗證程式碼。
在 [Team 總管] 中,按兩下組建定義,然後按一下 [處理序]。
在 [建置流程參數] 底下,展開 [編譯],然後在 [MSBuild 引數] 參數中輸入下列內容:
/p:ValidateArchitecture=true
如需驗證錯誤的詳細資訊,請參閱 了解並解決圖層驗證錯誤。 如需 Team Foundation Build 的詳細資訊,請參閱:
疑難排解圖層驗證問題。
下列表格描述圖層驗證的問題及其解決方式。 這些問題不同於因程式碼與設計衝突而導致的錯誤。 如需這些錯誤的詳細資訊,請參閱 了解並解決圖層驗證錯誤。
問題 |
可能的原因 |
解決方式 |
---|---|---|
發生非預期的驗證錯誤。 |
若圖層圖表是從方案總管中的其他圖層圖表或是從相同模型專案中的圖層圖表複製來的,系統即不會對此圖層圖表進行驗證。 以這種方式複製的圖層圖表所包含的參考會與原始圖層圖表相同。 |
|
了解並解決圖層的驗證錯誤
當您針對圖層圖表驗證程式碼時,如果程式碼設計發生衝突會產生驗證錯誤。 例如,下列條件可能造成圖層驗證發生錯誤:
成品指派給錯誤的圖層。 在此情況下,請移動成品。
類別之類的成品以與架構發生衝突的方式使用另一個類別。 在此情況下,請重構程式碼以移除相依性。
若要解決這些錯誤,請更新程式碼直到驗證時不再出現錯誤為止。 您可以透過互動方式執行這項工作。
下列各節將說明這些錯誤的語法,解釋這些錯誤的意義,並且建議使用控制項來進行剖析和處理它們。
語法 |
描述 |
---|---|
ArtifactN(ArtifactTypeN) |
ArtifactN 是與圖層圖表上的圖層相關聯的成品。 ArtifactTypeN 是像 Class 或 Method 這樣的 ArtifactN 類型,例如: MySolution.MyProject.MyClass.MyMethod(Method) |
NamespaceNameN |
命名空間的名稱。 |
LayerNameN |
圖層圖表上圖層的名稱。 |
DependencyType |
Artifact1 與 Artifact2 之間的相依性關聯類型。 例如,Artifact1 與 Artifact2 之間具有 Calls 關聯性。 |
語法的錯誤。 |
錯誤的描述。 |
---|---|
AV0001: 無效的相依性: Artifact1(ArtifactType1) --> Artifact2(ArtifactType2) 圖層: LayerName1, LayerName2 | 相依性: DependencyType |
對於 LayerName2 中的 Artifact2,LayerName1 中的 Artifact1 不應該有相依性,因為 LayerName1 在 LayerName2 上沒有直接相依性。 |
AV1001: 無效的命名空間: Artifact 圖層: LayerName | 必要的命名空間: NamespaceName1 | 目前的命名空間: NamespaceName2 |
LayerName 要求其相關成品必須屬於 NamespaceName1。 Artifact 是在 NamespaceName2 中,而非 NamespaceName1 中。 |
AV1002: 相依於禁止的命名空間: Artifact1(ArtifactType1) | Artifact2(ArtifactType2) 圖層: LayerName | 禁止的命名空間: NamespaceName | 相依性: DependencyType |
LayerName 要求其相關成品不得相依於 NamespaceName。 Artifact1 無法相依於 Artifact2,因為 Artifact2 在 NamespaceName 中。 |
AV1003: 在禁止的命名空間中: Artifact(ArtifactType) 圖層: LayerName | 禁止的命名空間: NamespaceName |
LayerName 要求其相關成品不可屬於 NamespaceName。 Artifact 屬於 NamespaceName。 |
AV3001: 遺漏連結: 找不到 'Artifact' 的圖層 'LayerName' 連結。 您是否遺漏了組件參考? |
找不到成品的 LayerName 連結。 例如,類別的連結可能因為模型專案遺漏包含該類別之組件的參考而遺失。 |
AV9001: 架構分析發現內部錯誤。 結果可能不完整。 如需詳細資訊,請參閱詳細建置事件記錄檔或輸出視窗。 |
如需要詳細資訊,請參閱建置事件記錄檔或輸出視窗。 |