有没有办法阻止某些引用被包含在项目中?

时间:2013-06-21 01:20:40

标签: c# c#-4.0 reference

基本上我想做一些预防性维护。我希望某些第三方库可以防止在某个项目中作为参考包含在内。有什么方法可以指定项目禁止哪些引用?

编辑:我会澄清一下目的。我想要保护的项目是一个类库,我希望从一组非常特定的第三方库中获得功能。类库用于其他解决方案以实现通用数据访问功能,因此如果引用了这些第三方库,则也需要它们。目的是使一个项目只是一个数据访问库,并保持“包”轻量级。

EDIT2:不确定为什么选票下降。对这种事情是否可以完成感兴趣是一个问题。

5 个答案:

答案 0 :(得分:9)

尽管有这些投票,我觉得这是一个合理的问题。我在一个大型开发团队工作,所有人都使用相同的软件,并且遇到类似的问题。

我们在具有许多不同有界上下文的大型域驱动设计架构中工作,并且不希望人们在上下文之间添加引用。 我们有指南,标准,架构文档,代码审查等,许多事情阻止了IRL的引用(正如有人所说)。然而,我们有两个相对较新的初学者,他们对当前的结构没有多少经验,只是不知道所有的东西。他们碰巧审查了彼此的代码和瞧,添加了不需要的参考。

在试图防止错误发生并确保遵守标准方面,我没有看到任何严厉的行为。只是一个预防措施。这也不是我们编写单元测试的部分原因吗?那么将来其他一些新人可以意识到他们在不知不觉中破坏了什么?

我不特别喜欢分析项目文件以获取参考文献。我们可能处理它的方法是定义一组单元测试,它们遍历每个被测项目的程序集引用,并在识别不应该存在的引用时失败。 显然,只有在持续集成/部署(包括运行单元测试)时才有效。

所以,即使新人检查了一些东西而没有在本地首先运行单元测试(并意识到他们的错误),我们明亮的红色闪烁构建状态指示灯或构建服务器电子邮件将很快告诉团队中的每个人出了什么问题

答案 1 :(得分:7)

您可以使用Visual Studio Layer Diagrams来实现此目的(假设您拥有Visual Studio Ultimate)。绘制一个表示项目的框/图层,然后将项目拖放到它上面以链接它们,绘制一个表示禁止组件的框/图层,然后将这些组件放到它上面以链接它们,并完成(通过不绘制之间的依赖关系箭头)你告诉VS,不允许依赖。)

现在通过设置MSBuild属性打开项目和/或TFS Build中的图层验证:ValidateArchitecture = True

答案 2 :(得分:2)

搜索允许的程序集并标记异常可能更实际,因为有人可以简单地将恶意程序集重命名为不在列表中的名称并转义检测。

用于构建程序集的.csproj文件是一个普通的XML文件,因此可以使用XPath语句轻松定位引用的程序集,其中谓词是允许的程序集名称。您可以设置一个触发器,每当.csproj文件签入源存储库时,扫描文件并标记任何罪魁祸首程序集。

使用这种方法或任何类似方法会带来您邀请流氓开发者玩跳跃游戏的风险。而且你可能会因为开发人员是一流的跨越式玩家而失去那场比赛。因此,更有力的方法是减少对技术的依赖,而更多地依赖于管理资源的计划。

答案 3 :(得分:2)

这绝对是一个有效的问题,而本的答案几乎可以解决问题。但是,此工具可以帮助自动执行参考约束:

NsDepCop

答案 4 :(得分:1)

编写Roslyn Compiler的扩展名,同时检查所有规则,并将此分析器放入解决方案中。您的分析将成为编译的一部分。

这与NsDepCop的工作原理非常相似。