我有 3 个程序集:
- A 定义一个接口
- B 引用 A 并使用该接口
- C 也引用了 A
如何确保 C 不使用该接口?
拆分组件 - 不是一种选择。
您可以将接口设为内部,并用于InternalsVisibleToAttribute
允许访问(通过将属性添加到)B
的内部成员。但它的粒度非常粗——你不能为单个成员做这件事;要么全无。A
A
但总的来说,这种特定的限制并不是 .NET 或 C# 中访问控制设计的一部分。
当然,您可以尝试将接口拆分为一个新程序集,并通过它对 A 和 B 都可用-InternalsVisibleTo
但您不想经常这样做。该平台不是为这类事情而设计的。(它会起作用,但使用的类型越多,就越难。)
我会将接口放在它自己的程序集(.csproj)中,并且只让项目 B 引用该程序集。
在我看来,通过这种方式,您可以在遵循最佳实践的同时实现最佳封装。
如果A在您的控制范围内,请让实现您的接口的类检查调用堆栈并阻止访问。这是一个沉重的运行时黑客。我当然不想使用它!
如果C未签名,您可以使用一些程序集重写魔法将 A 重写(复制)到A '但不暴露接口。然后参考A'。这个也有点重。
虽然我知道拆分程序集不是一种选择,但为了完整性,我将其放入:重构它们并且不要使用C中的接口引用程序集。