2

是否可以对 Visual Studio 中项目之间允许的依赖项设置自动强制限制?

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

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

4

2 回答 2

2

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

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

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

于 2013-01-23T12:06:02.343 回答
1

我刚刚通过 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>

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

Source and install instructions: https://github.com/CodeHex/Ref-Restrict

于 2015-06-17T15:52:16.107 回答