是否可以在Visual Studio中限制程序集之间的依赖关系?

时间:2013-01-23 11:52:10

标签: .net visual-studio

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

例如,假设我有三个简单的图层;用户界面,业务和数据。我是否可以强制执行UI永远不应该持有对数据的引用,并且如果发生这样的事情就停止构建解决方案?

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

2 个答案:

答案 0 :(得分:2)

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

一旦正确设置了引用,就可以监视项目文件的更改,以告知何时添加了其他硬引用。任何源代码控制系统都可以轻松地进行版本比较,有些(即TFS)甚至可以在特定文件发生更改时(例如更改项目文件时)通知您。

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

答案 1 :(得分: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>

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

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