3

我有 3 个程序集:

  • A 定义一个接口
  • B 引用 A 并使用该接口
  • C 也引用了 A

如何确保 C 不使用该接口?

拆分组件 - 不是一种选择。

4

3 回答 3

6

可以将接口设为内部,并用于InternalsVisibleToAttribute允许访问(通过将属性添加到)B的内部成员。但它的粒度非常粗——你不能为单个成员做这件事;要么全无。AA

但总的来说,这种特定的限制并不是 .NET 或 C# 中访问控制设计的一部分。

当然,您可以尝试将接口拆分为一个新程序集,并通过它对 A 和 B 都可用-InternalsVisibleTo但您不想经常这样做。该平台不是为这类事情而设计的。(它会起作用,但使用的类型越多,就越难。)

于 2013-09-20T13:47:58.260 回答
1

我会将接口放在它自己的程序集(.csproj)中,并且只让项目 B 引用该程序集。

在我看来,通过这种方式,您可以在遵循最佳实践的同时实现最佳封装。

于 2013-09-20T13:55:13.057 回答
0

如果A在您的控制范围内,请让实现您的接口的类检查调用堆栈并阻止访问。这是一个沉重的运行时黑客。当然不想使用它!

如果C未签名,您可以使用一些程序集重写魔法将 A 重写(复制)A '但不暴露接口。然后参考A'。这个也有点重。

虽然我知道拆分程序集不是一种选择,但为了完整性,我将其放入:重构它们并且不要使用C中的接口引用程序集。

于 2013-09-20T13:55:50.190 回答