我可以强制C#中的命名空间之间的依赖关系

Gar*_*wen 3 c# class-design namespaces

我可以限制特定命名空间中的类引用另一个特定命名空间中的类吗?两个名称空间都存在于同一.NET程序集中.

例:

namespace LegacyCode
{
    class LegacyClass { ... }
}

namespace NewCode
{
    class NewClass {...}
}
Run Code Online (Sandbox Code Playgroud)

我不希望'NewCode'中的类能够引用'LegacyCode'中的类.

选项:

  1. 有不同的程序集(使部署更难,构建需要更长时间)
  2. 使用像NDetect这样的工具(花钱!)

有没有人有任何其他想法?

MPr*_*ard 10

考虑使用Obsolete属性标记类.这将导致任何本身未标记为"已过时"的代码在编译期间生成警告.

在项目文件的"构建"选项卡上启用"将警告视为错误"设置,以使此警告无法通过编译而无法编译.

编辑:

同意单独的程序集是一个很好的策略,可以帮助淡出这段代码.这不会阻止人们提到它.过时的属性清楚地表明这个代码已经过时了.

编辑#2:

感谢Dan Tao指出了Obsolete属性的重载构造函数.这意味着您可以强制是否应将某事物的使用视为错误,而不必将处理警告视为错误.还有用的是指定指示用户解决方法的消息的选项.编译期间在错误/警告中显示此消息.


Pon*_*gge 7

记录设计,与人交谈,审查代码.不要试图将技术抛给人们的问题.(不过,使用像NDetect这样的工具,评论部分可以变得更有效.)

如果您确实需要隔离设计更改,请选择单独的程序集:这是预期的设计机制.但请确保您对接口和实现都有合理的版本控制方案.

  • 很高兴听到!我认为你将不得不咬紧牙关并以单独的装配管理或依赖执行工具的形式接受成本.我不知道任何NDepend的免费替代品(当然也没有其功能集).但依赖性打破会花费你的钱,特别是如果维护持续几年 - 前期投资以避免后来的技术债务听起来更可取. (2认同)