【问题标题】:Is it possible to restrict dependencies between assemblies in Visual Studio?是否可以限制 Visual Studio 中程序集之间的依赖关系?
【发布时间】:2015-06-17 23:52:16
【问题描述】:

是否可以对 Visual Studio 中项目之间允许的依赖关系自动实施强制限制?

例如,假设我有三个简单的层; UI、业务和数据。如果发生这种情况,我是否可以强制 UI 永远不应持有对 Data 的引用并停止构建解决方案?

我希望坚持不懈的开发人员能够解决这个问题,但可以看到它在指导开发人员和及早发现错误方面的好处。

【问题讨论】:

  • 松耦合。 MEF 是您的答案。
  • 想详细说明@Jodha?
  • 如果编译时无法catch,或许可以在check-in时catch。还有 NDepend (usage example;another),但它可能对您的要求有点过分(尽管我意识到您的问题文本只是一个说明)。

标签: .net visual-studio


【解决方案1】:

您不能直接或强制阻止引用,但您可以自己设置引用,这将有助于您的方案,因为人们将无法添加回引用(硬循环引用)。这并不能阻止使用 MEF 或 Unity 等库的人以非常松散的解耦方式四处跳动——他们完全有可能解析或加载您不期望的程序集并调用它们(我称之为 逻辑循环依赖)。防止这种情况的唯一方法是通过代码审查保持警惕。

正确设置参考后,您就可以监控项目文件的更改,以判断何时添加了其他硬参考。任何源代码控制系统都可以让版本比较变得非常容易,有些(例如 TFS)甚至可以让您在特定文件更改时收到通知(例如项目文件更改时)。

再一次,您拥有的最可靠的选择是代码审查。

【讨论】:

    【解决方案2】:

    我刚刚通过 Nuget 为 Visual Studio 下载了 Ref-Restrict。目前看来还可以。

    它检查每个项目的引用,检查 他们反对一组自定义规则(限制)。当解决方案 或项目已构建,如果有任何违规行为,构建将停止。 确切的问题将在 Visual Studio 中报告为构建错误。

    配置如下:

    <rrconfig>
      <!-- The core library should have no local dependencies -->
      <!-- Data access libraries should not be included as data access should be in the data library -->
      <rules project="RR.Core">
        <nolocalrefs/>
        <exclude>EntityFramework</exclude>
        <exclude>EntityFramework.SqlServer</exclude>
      </rules>
    
      <!-- The data library should only have access to the core library and no other local libs. -->
      <!-- Data access libraries should definitely be included -->
      <rules project="RR.Data">
        <onlylocalrefs>
          <project>RR.Core</project>
        </onlylocalrefs>
        <include>EntityFramework</include>
        <include>EntityFramework.SqlServer</include>
      </rules>
    </rrconfig>
    

    博客:http://www.benibinson.com/blog/2014/8/31/restrict-project-references-with-ref-restrict

    源码和安装说明:https://github.com/CodeHex/Ref-Restrict

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多