检测.NET中名称空间之间的依赖关系

时间:2008-11-20 11:04:06

标签: .net dependencies coupling

是否有任何实用程序可以检查一组托管程序集,并告诉您一个名称空间中的任何类型是否依赖于另一个名称空间中的任何类型?例如,假设我有一个MyApp.BusinessRules命名空间,并且不希望它直接访问MyApp.GUI中的任何内容,但两个命名空间都在同一个程序集中。我的目标是能够编写一个自定义MSBuild任务,以验证各种耦合规则是否已被破坏。

到目前为止,我遇到的唯一一个看起来可能会这样做的工具是NDepend,但我想知道是否有更简单的解决方案。

6 个答案:

答案 0 :(得分:3)

我怀疑NDepend将是最简单的方法,说实话。

但是,如果你真的不希望一个程序集的位相互引用,你几乎肯定会将程序集分成更多逻辑单元。

答案 1 :(得分:2)

  

到目前为止,我遇到的唯一一个看起来可能会这样做的工具是NDepend,但我想知道是否有更简单的解决方案。

我是该工具NDepend的开发人员之一。请您告诉我们您在NDepend中发现了哪些复杂内容以及您如何想象一个更简单的解决方案?

NDepend有3种不同的方式来做你想做的事:Dependency MatrixDependency Graph你还可以写一些Code Rule over LINQ Query (CQLinq)和规则到detect cycle between namespaces,或强制执行某些特定的的依赖关系。

  

例如,假设我有一个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 }

答案 2 :(得分:2)

您可以使用DSM plugin for .NET Reflector(我是它的开发人员)分析命名空间依赖关系

分析装配后,您可以将项目保存到文件中。此文件只是具有简单结构的XML,因此您可以将其传递给脚本以进行自定义分析

[更新] :此插件现在以Visual Studio加载项的形式提供

答案 3 :(得分:1)

您可以尝试使用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来探索现有代码中的关系和组织   生成有向图文档。这些图表代表代码元素及其关系   作为通过链接或边连接的一组节点。您可以使用这些图表来帮助您   可视化,探索和分析代码。

如何:使用Architecture Explorer查找代码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解决方案中的工件到逻辑,抽象组或层。这些层   描述这些工件执行的主要任务或系统的主要组件。箭头   层之间表示这些之间存在或应该存在的相互依赖关系   文物。要对代码强制执行体系结构约束,请描述预期的依赖关系   该图表然后根据图表验证代码。通过在此使用层图   方式,您可以帮助使代码更容易理解,重用和维护。

Layer Diagram 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

答案 4 :(得分:1)

很可能马克早就解决了他的问题,所以这个答案适用于使用 VS 社区的新手。最近我在那里遇到了 NsDepCop,它碰巧既免费又有用。

我在使用 VS 2019 Community 构建的项目中使用它,尽管设置 config.nsdepcop 可能有点麻烦,但它仍然有效 - 毕竟它正在编辑 XML 规则。

答案 5 :(得分:0)

Reflector就是这样做的。

右键单击命名空间,单击Analyze,viola! :)