防止将特定装配添加到我的工厂项目中?

时间:2009-11-16 14:21:08

标签: .net assemblies reference factory compiler-errors

我创建了一个工厂程序集,可以处理任何类型的事务(支持ITransactionType)。我可以在单独的程序集中添加更多的事务类型,所有这些都可以在工厂使用,而不需要重新编译(这是工厂的好处之一)。

有一个可以处理的事务类型的实际列表,所以我已经定义了一个带有const字符串的静态类,它保存在一个单独的程序集中。其他程序集引用它以确保一致的事务类型名称。这个程序集由工厂引用,因为它不需要知道,并且会导致该项目的不必要的编译。

这一切都很好。我永远不会在工厂项目中引用主列表程序集,因为它知道它没有意义。

但是,我担心如果项目由不了解所有这些的人维护,他们可能会错误地将引用添加到主列表程序集中。有没有办法阻止添加此引用? IOW,如果某人(可能甚至将来自己)添加了引用,是否有某种方法可以强制编译错误,指出行为不可接受的原因解释?

1 个答案:

答案 0 :(得分:2)

我可以想到几种方法,但据我所知,语言(.net,C#,vb)没有提供特定的方法:

  1. 使用源代码控制(无论如何),在编译后,从解决方案中卸载项目(右键单击>卸载),签入并标记为final,readonly或其他任何内容以防止进一步更改。
  2. 添加一个小型脚本,执行预编译步骤,检查不允许的引用(您可以在项目属性下添加它)。
  3. 在您的来源中添加#warning,并始终发出:“不应该使用XXX编译”,请确保它不在“
  4. 对自身使用循环依赖:在常量库中添加Transaction工厂的引用,这将有效防止以相反的方式添加引用。
  5. 有点麻烦:使用反射从cctor(静态构造函数)动态检查是否存在引用,如果找到则抛出异常。如果有人试图添加对此lib的引用,这将抛出一个硬异常(但仅限于任何测试)。
  6. 也许更基本:在你的nUnit测试中(或你使用的任何测试框架),只需添加一个测试:MustNotReferenceXXX并在其体内动态检查是否引用了lib。
  7. 如果我能想到更容易的话,我会更新,但我认为第5和第6点是最容易实现和未来的证据。