簡體   English   中英

檢測 .NET 中命名空間之間的依賴關系

[英]Detecting dependencies between namespaces in .NET

是否有任何實用程序可以檢查一組托管程序集並告訴您一個命名空間中的任何類型是否依賴於另一個命名空間中的任何類型? 例如,假設我有一個MyApp.BusinessRules命名空間並且不希望它直接訪問MyApp.GUI任何MyApp.GUI ,但是兩個命名空間都在同一個程序集中。 我的目標是能夠編寫一個自定義的 MSBuild 任務來驗證各種耦合規則沒有被破壞。

到目前為止,我遇到的唯一一個看起來可能會這樣做的工具是NDepend ,但我想知道是否有更簡單的解決方案。

老實說,我懷疑 NDepend 將是最簡單的方法。

但是,如果您真的不希望一個程序集的各個部分相互引用,則幾乎肯定應該將程序集拆分為更多的邏輯單元。

到目前為止,我遇到的唯一一個看起來可以做到這一點的工具是 NDepend,但我想知道是否有更簡單的解決方案。

我是NDepend工具的開發者之一。 請您讓我們知道您認為 NDepend 中的哪些方面很復雜,以及您如何為您設想一個更簡單的解決方案?

NDepend 提供了 3 種不同的方式來做你想做的事情:依賴矩陣依賴圖,你也可以編寫一些代碼規則超過 LINQ 查詢(CQLinq)和規則來檢測命名空間之間的循環,或強制執行一些特定的依賴關系。

例如,假設我有一個 MyApp.BusinessRules 命名空間並且不希望它直接訪問 MyApp.GUI 中的任何內容,但兩個命名空間都在同一個程序集中。

為此,可以編寫以下 CQLinq 規則,還有比這更簡單的嗎?:

warnif count > 0
let businessRules = Application.Namespaces.WithNameLike("^MyApp.BusinessRules")
let gui = Application.Namespaces.WithNameLike("^MyApp.GUI")

from n in businessRules.UsingAny(gui)
let guidNamespacesUsed = n.NamespacesUsed.Intersect(gui)
select new { n, guidNamespacesUsed }

您可以使用 .NET Reflector 的DSM 插件分析命名空間依賴關系(我是它的開發人員)

分析程序集后,您可以將項目保存到文件中。 此文件只是具有簡單結構的 XML,因此您可以將其傳遞給腳本以進行自定義分析

[更新] :此插件現在以 Visual Studio 加載項的形式提供

您可以嘗試使用 Visual Studio 2010 Ultimate 的 RC 版本來生成 .NET 代碼的依賴關系圖。 您可以生成所有程序集、命名空間、類或它們的某種組合的圖形,或者您可以使用 Architecture Explorer 來選擇您想要可視化的特定工件和關系。

您還可以從依賴關系圖或現有工件創建層圖,繪制允許的依賴項,然后將層驗證作為 MSBuild 過程的一部分,以確保不會引入無效的依賴項:

如何:從代碼生成圖形文檔http : //msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource

您可以使用 Visual Studio Ultimate 通過生成有向圖文檔來探索現有代碼中的關系和組織。 這些圖將代碼元素及其關系表示為通過鏈接或邊連接的一組節點。 您可以使用這些圖表來幫助您可視化、探索和分析代碼。

如何:使用架構資源管理器查找代碼http : //msdn.microsoft.com/en-us/library/dd409431%28VS.100%29.aspx

您可以使用 Architecture Explorer 選擇要可視化的垂直代碼段或“片段”。 您可以瀏覽 Visual Studio 解決方案中的源代碼或 .dll 文件或 .exe 文件中已編譯的托管代碼。 您可以使用 Architecture Explorer 通過安裝其他提供程序來瀏覽其他域。 當您找到要可視化的代碼時,您可以生成圖表來探索該代碼中的關系。

如何:從工件創建層圖http : //msdn.microsoft.com/en-us/library/dd465141%28VS.100%29.aspx

...使用層圖來可視化系統的高級架構並驗證代碼是否符合此設計。 要執行此任務,請將 Visual Studio 解決方案中的工件組織並關聯到邏輯、抽象組或層。 這些層描述了這些工件執行的主要任務或系統的主要組件。 層之間的箭頭表示這些工件之間存在或應該存在的相互依賴性。 要對代碼實施體系結構約束,請在圖表上描述預期的依賴關系,然后根據圖表驗證代碼。 通過以這種方式使用層圖,您可以幫助使代碼更易於理解、重用和維護。

層圖 http://i.msdn.microsoft.com/Dd465141.UML_LayerRefReading(en-us,VS.100).png

如何:根據層圖驗證代碼http : //msdn.microsoft.com/en-us/library/dd409395%28VS.100%29.aspx

根據層圖驗證代碼可幫助您在代碼演變時對其實施架構約束。 執行此任務時,會將代碼中的依賴項與圖表中的依賴項進行比較。

RC 下載http : //www.microsoft.com/downloads/details.aspx ? displaylang=en&FamilyID=457bab91-5eb2-4b36-b0f4- d6f34683c62a

Visual Studio 2010 架構探索和建模工具論壇: http : //social.msdn.microsoft.com/Forums/en-US/vsarch/threads

很可能馬克很久以前就解決了他的問題,所以這個答案適用於使用 VS 社區的新手 最近我在那里遇到了NsDepCop ,它碰巧既免費又有用。

我在使用 VS 2019 Community 構建的項目中使用它,盡管設置config.nsdepcop可能有點麻煩,但它仍然有效 - 畢竟它正在編輯 XML 規則。

反射器就是這樣做的。

右鍵單擊命名空間,單擊分析,中提琴! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM