通过反射检查命名空间之间的依赖关系

时间:2013-11-01 11:05:49

标签: c# unit-testing reflection

我的程序集中有两个单独的命名空间:DataAccessDomainLogic

我需要一个代码段,检查DomainLogic中的任何类都不依赖于命名空间DataAccess

你怎么样?

PS:我想我在Mark Seemann的精彩书籍Dependency Injection in .Net中看到了这样一个单元测试的例子,但我没有在这里找到它并且无法通过Google找到一个例子。

修改

由于到目前为止的所有反应都指出我应该将这些相互依赖的类分成两个不同的组件,我想指出这目前不是一个选项(尽管这确实是我最终的主要目标之一) 。我正在处理遗留代码,我现在无法在一个大爆炸中重构它。单独的命名空间和它们之间依赖关系的测试是一个中间步骤。一旦测试通过,我就可以继续将部分代码移动到不同的程序集中。

2 个答案:

答案 0 :(得分:1)

程序集中的所有代码都可以合法地访问整个程序集的其余部分的公共和内部代码。因此,即使可能,这样的单元测试也是一个坏主意。

如果将DataAccess类型拆分为单独的项目并将其全部内部化,那么任何东西都无法访问它。显然不是你想要的。但是,通过拆分它,您可以确保DomainAccess可以访问DomainLogic,但反之亦然。这大概就是你想要的。

与此同时,不要尝试开发单元测试以检查“DomainLogic必须不能访问DomainAccess”的规则,而是使用代码评论。假设您正在使用敏捷方法(如果没有,请执行此操作!),所有活动都将记录为任务。在理解并接受您的规则的人查看任务的代码更改之前,任何任务都不能被视为“完成”。打破规则,任务无法进行代码审查,必须在完成之前进行重新设计。

答案 1 :(得分:0)

这是一个可以做到这一点的工具:根据您的规则检查命名空间依赖关系,并在构建时将违规报告为警告或错误。 它被称为NsDepCop,免费,开源。

规则配置看起来像这样:

<NsDepCopConfig IsEnabled="True" CodeIssueKind="Warning">
    <Allowed From="*" To="*" />
    <Disallowed From="DomainLogic" To="DataAccess" />
</NsDepCopConfig>