是否可以对 Visual Studio 中项目之间允许的依赖项设置自动强制限制?
例如,假设我有三个简单的层;UI、业务和数据。如果发生这种情况,我是否可以强制 UI 永远不应持有对 Data 的引用并停止构建解决方案?
我希望持久的开发人员能够解决这个问题,但可以看到它在指导开发人员和及早发现错误方面的好处。
是否可以对 Visual Studio 中项目之间允许的依赖项设置自动强制限制?
例如,假设我有三个简单的层;UI、业务和数据。如果发生这种情况,我是否可以强制 UI 永远不应持有对 Data 的引用并停止构建解决方案?
我希望持久的开发人员能够解决这个问题,但可以看到它在指导开发人员和及早发现错误方面的好处。
您不能直接或强制阻止引用,但您可以自己设置引用,这将有助于您的方案,因为人们将无法添加回引用(硬循环引用)。这并不能阻止使用 MEF 或 Unity 等库的人以非常松散的解耦方式四处跳动——他们完全有可能解析或加载您不期望的程序集并调用它们(我称之为逻辑循环依赖)。防止这种情况的唯一方法是通过代码审查保持警惕。
一旦您正确设置了引用,您就可以监控对项目文件的更改,以判断何时添加了其他硬引用。任何源代码控制系统都可以让版本比较变得非常容易,有些(即 TFS)甚至允许您在特定文件更改时收到通知(例如项目文件更改时)。
再一次,您拥有的最可靠的选择是代码审查。
我刚刚通过 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