是否可以对Visual Studio中项目之间允许的依赖关系实施自动强制限制?
例如,假设我有三个简单的图层;用户界面,业务和数据。我是否可以强制执行UI永远不应该持有对数据的引用,并且如果发生这样的事情就停止构建解决方案?
我希望持久的开发人员能够解决这个问题,但可以在指导开发人员和早期发现错误方面看到它的好处。
答案 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