是否有任何实用程序可以检查一组托管程序集并告诉您一个命名空间中的任何类型是否依赖于另一个命名空间中的任何类型?例如,假设我有一个MyApp.BusinessRules
命名空间并且不希望它直接访问 中的任何内容MyApp.GUI
,但两个命名空间都在同一个程序集中。我的目标是能够编写一个自定义的 MSBuild 任务来验证各种耦合规则是否被破坏。
到目前为止,我遇到的唯一一个看起来可能会这样做的工具是NDepend,但我想知道是否有更简单的解决方案。
是否有任何实用程序可以检查一组托管程序集并告诉您一个命名空间中的任何类型是否依赖于另一个命名空间中的任何类型?例如,假设我有一个MyApp.BusinessRules
命名空间并且不希望它直接访问 中的任何内容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 代码生成依赖关系图。您可以生成所有程序集、命名空间、类或它们的某种组合的图表,或者您可以使用架构资源管理器来选择特定的工件和您想要可视化的关系。
您还可以从依赖关系图或现有工件创建层图,绘制允许的依赖关系,然后将层验证作为 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 社区构建的项目中使用它,尽管设置config.nsdepcop
可能有些麻烦,但它仍然有效——毕竟它是在编辑 XML 规则。
反射器做到了这一点。
右键单击命名空间,单击分析,中提琴!:)