是否可以对Visual Studio中的项目之间允许的依赖关系自动执行限制?是否可以在Visual Studio中限制程序集之间的依赖关系?
例如,假设我有三个简单的图层,用户界面,业务和数据。我是否可以强制该用户界面永远不应该持有对数据的引用,并在这种情况发生时停止解决方案的构建?
我期望一个持久的开发人员能够解决这个问题,但可以从指导开发人员和早期发现错误的角度看到它的好处。
是否可以对Visual Studio中的项目之间允许的依赖关系自动执行限制?是否可以在Visual Studio中限制程序集之间的依赖关系?
例如,假设我有三个简单的图层,用户界面,业务和数据。我是否可以强制该用户界面永远不应该持有对数据的引用,并在这种情况发生时停止解决方案的构建?
我期望一个持久的开发人员能够解决这个问题,但可以从指导开发人员和早期发现错误的角度看到它的好处。
你不能直接或强制地阻止引用,但你可以做的是自己设置引用,这将有助于你的场景,因为人们将无法添加引用(硬循环引用)。这不会阻止使用像MEF或Unity这样的库的人以非常松散的分离方式跳过 - 它们完全可能解决或加载不期望的程序集并调用它们(我将其称为逻辑循环依赖)。防止这种情况的唯一方法是通过代码审查提高警惕。
一旦您正确设置了引用,您就可以监视项目文件的更改,以确定何时添加了其他硬引用。任何源代码管理系统都可以使版本比较变得简单,有些(即TFS)甚至可以让你在特定文件发生变化时得到通知(比如当项目文件发生变化时)。
再一次,你最可靠的选择是代码评论。
我刚刚下载Ref-Restrict对于Visual Studio,通过Nuget。似乎现在好了。
它检查每个项目的参考文献,检查 它们是否违反一组自定义的规则(限制)。当解决方案 或项目建立时,如果有任何违规,构建将停止。 确切的问题将在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
松耦合。 MEF是你的答案。 – JSJ
照顾精心制作@Jodha? –
如果在编译时无法捕捉到,则可以在检入时捕获。还有NDepend([使用示例](http://stackoverflow.com/questions/304967); [另一个](http://www.gamlor.info/wordpress/2011/03/ndepend-creating-dependency-violation-警告/)),但它可能是为你的要求矫枉过正(虽然我认识到你的问题文本只是一个例证)。 – AakashM