【发布时间】:2018-04-19 15:35:16
【问题描述】:
我的类结构如下:
AssemblyA.dll
public abstract class MyBase
AssemblyB.dll(引用 AssemblyA.dll)
public sealed class MyClass : MyBase
AssemblyC.dll(引用 AssemblyB.dll)
MyClass myClass = new MyClass();
myClass.Xyz = "some text";
编译 AssemblyC 时,编译器引发错误:
“MyBase”类型是在未引用的程序集中定义的。您必须添加对程序集 'AssemblyA,........' 的引用。
我了解错误的原因,并且在 AssemblyC.dll 中添加 AssemblyA.dll 的引用将解决该问题。
但我不想添加该引用。我应该实施哪些替代设计实践以避免添加该参考?
更多信息:
基类 MyBase 在 AssemblyA.dll 中用于通用实现,如下所示:
class SomeClassInAssemblyA<T> : ISomeInterface where T : MyBase
AssemblyB.dll 中定义了多个具体实现,包括MyClass,如下所示:
public sealed class MyClass : MyBase
{
public string Xyz { get; set; }
}
具体类MyClass 用于AssemblyB.dll 和AssemblyC.dll。
目标:
- 从 A 到 B 到 C 的引用应该只有一种方式。
- 引用应该是连续的,C 应该只引用 B 并且 B 应该只引用 A。
AssemblyA.dll 正在多个项目中使用。
这就是不能使用InternalsVisibleToAttribute 的原因。
因此,如果我在 AssemblyA 中创建成员 internal 并实现 InternalsVisibleToAttribute 属性,那么这些只能对 AssemblyB 可见;这行不通。
我仍然可以修改 AssemblyA,但更改不应明确针对特定项目。
其他两个程序集(B 和 C)仅由一个项目使用。所以,我可以用任何方式改变它们。
【问题讨论】:
-
“我应该实施哪些替代设计实践来避免添加该参考?”不要在程序集中使用任何类型。如果您以任何方式使用该类型(通过引用编译时常量除外),则程序集 必须 被引用。用 A 中的基类型引用 B 中的类型意味着您需要了解程序集 A - 否则编译器无法知道它提供了哪些成员。您没有解释的是为什么您不希望程序集 C 知道程序集 A。
-
我唯一的建议是让共同的事物变得共同。分离你的关注点,如果你处于这样的困境中,是时候重构了。我的意思是您的业务逻辑和架构没有设计模式。如果您想将事物分成不同的项目,请确保它们具有合适的层次结构
-
如果你使用一个程序集,你必须引用它,否则编译器无法知道你想要它做什么。您使用派生类型,因此您使用的是程序集...
-
基本上,我应该实施哪些替代设计实践以避免添加该引用?没有。这里的问题是你试图做一些没有意义的事情。您必须引用所有程序集以实例化您使用的类(句号)不可能提供更多建议,因为您试图实现的目标尚不清楚(并且是对于这种格式也可能过于宽泛)。
标签: c# oop inheritance