2013-01-23 40 views
1

是否可以对Visual Studio中的项目之间允许的依赖关系自动执行限制?是否可以在Visual Studio中限制程序集之间的依赖关系?

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

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

+0

松耦合。 MEF是你的答案。 – JSJ

+0

照顾精心制作@Jodha? –

+2

如果在编译时无法捕捉到,则可以在检入时捕获。还有NDepend([使用示例](http://stackoverflow.com/questions/304967); [另一个](http://www.gamlor.info/wordpress/2011/03/ndepend-creating-dependency-violation-警告/)),但它可能是为你的要求矫枉过正(虽然我认识到你的问题文本只是一个例证)。 – AakashM

回答

2

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

一旦您正确设置了引用,您就可以监视项目文件的更改,以确定何时添加了其他硬引用。任何源代码管理系统都可以使版本比较变得简单,有些(即TFS)甚至可以让你在特定文件发生变化时得到通知(比如当项目文件发生变化时)。

再一次,你最可靠的选择是代码评论。

0

我刚刚下载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

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