【问题标题】:Detecting dependencies between namespaces in .NET检测 .NET 中命名空间之间的依赖关系
【发布时间】:2010-09-23 05:29:00
【问题描述】:

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

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

【问题讨论】:

  • 你有没有得到更多关于这个的信息,或者成功地创建了这个构建任务?我对这个特定功能非常感兴趣。

标签: .net dependencies coupling


【解决方案1】:

到目前为止,我遇到的唯一一个看起来可以做到这一点的工具是 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 }

【讨论】:

  • 我们前段时间下载了 NDepend 来评估它。有很多东西要学,我仍然在掌握矩阵的含义。我很想看看我是否可以编写 CQL 来查询命名空间之间的特定依赖关系。
  • 马克,我用新的 NDepend v4 CQLinq 功能重构了我的答案。希望现在按照您在这个问题中的要求做事从未如此简单。
【解决方案2】:

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

但是,如果您真的不希望一个程序集的各个部分相互引用,则几乎可以肯定地将程序集拆分为更多的逻辑单元。

【讨论】:

  • 是的,我想分解程序集,但是当您的解决方案中开始有超过 40 个左右的项目时(尤其是当您的开发机器使用 5 年时),Visual Studio 的性能非常糟糕
  • 您应该能够为您的开发机器提供更新的理由......然后考虑您是否需要在同一个解决方案中使用所有这些项目。听起来您这里有 1 个项目,应该是两个 - 您还有其他项目应该合并吗?
  • 它是一个大型 WinForms 可执行文件,它承载 8 或 9 个子“应用程序”,因此一旦您将共享代码分解为可重用组件并添加一些单元测试程序集,项目的数量就会变得相当多高。
  • 我怀疑我会将其重构为多个解决方案 - 每个子应用程序一个、“shell”和“公共代码”解决方案。我知道引用文件而不是项目很痛苦,但它确实让事情变得更简洁。
【解决方案3】:

您可以使用 .NET Reflector 的 DSM plugin 分析命名空间依赖项(我是它的开发者)

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

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

【讨论】:

  • 这个插件很棒,我一直在用它来分析和重构一个大型项目,它提供了你需要的信息。谢谢!
【解决方案4】:

您可以尝试 Visual Studio 2010 Ultimate 的 RC 版本来为 .NET 代码生成依赖关系图。您可以生成所有程序集、命名空间、类或它们的某种组合的图表,或者您可以使用架构资源管理器来选择特定的工件和您想要可视化的关系。

您还可以从依赖关系图或现有工件创建层图,绘制允许的依赖关系,然后将层验证作为 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

您可以选择要可视化的代码的垂直部分或“切片” 架构探索者。您可以在 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

【讨论】:

    【解决方案5】:

    很可能马克很久以前就解决了他的问题,所以这个答案适用于使用 VS 社区的新手。最近在外面遇到NsDepCop,碰巧又免费又好用。

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

    【讨论】:

      【解决方案6】:

      反射器会这样做。

      右击命名空间,点击分析,中提琴! :)

      【讨论】:

      • 一个有用的提示,但它似乎只显示了我的命名空间所依赖的程序集,而不是哪些命名空间
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多