C# 如何避免引用只包含基类的程序集?
我的班级结构如下: AssemblyA.dllC# 如何避免引用只包含基类的程序集?,c#,oop,inheritance,C#,Oop,Inheritance,我的班级结构如下: AssemblyA.dll public abstract class MyBase public sealed class MyClass : MyBase AssemblyB.dll(参考AssemblyA.dll) AssemblyC.dll(参考AssemblyB.dll) 编译AssemblyC时,编译器引发错误: 类型“MyBase”是在未引用的程序集中定义的。您必须添加对程序集“AssemblyA,…”的引用 我理解错误的原因,并且在AssemblyC.dl
public abstract class MyBase
public sealed class MyClass : MyBase
AssemblyB.dll(参考AssemblyA.dll)
AssemblyC.dll(参考AssemblyB.dll)
编译AssemblyC时,编译器引发错误:
类型“MyBase”是在未引用的程序集中定义的。您必须添加对程序集“AssemblyA,…”的引用
我理解错误的原因,并且在AssemblyC.dll中添加AssemblyA.dll的引用将解决此问题
但我不想再加上这一点。我应该实施什么替代设计实践来避免添加该引用 更多信息: 基类
MyBase
在AssemblyA.dll中用于以下一般实现:
class SomeClassInAssemblyA<T> : ISomeInterface where T : MyBase
public sealed class MyClass : MyBase
{
public string Xyz { get; set; }
}
在AssemblyB.dll和AssemblyC.dll中使用具体类MyClass
目标:
- 引用只能是从A到B到C的单向引用
- 参考文献应顺序排列,C仅参考B,B仅参考A
InternalsVisibleToAttribute
。
因此,如果我在AssemblyA中设置成员internal
,并实现InternalsVisibleToAttribute
属性,那么这些成员只能对AssemblyB可见;这是行不通的。
我仍然可以修改AssemblyA,但更改不应明确针对特定项目
其他两个部件(B和C)仅由一个项目使用。因此,我可以以任何方式更改它们。另一种设计实践是使用组合而不是继承:
public sealed class MyClass
{
private MyBase myBase = ...;
}
如果您的设计确实使AssemblyC能够在不知道MyBase
的情况下对MyClass
执行任何合理的操作,那么必须能够在不知道如何初始化MyBase
的情况下实例化MyClass
。因此,MyClass
本身或在DI的帮助下应该包含这些知识
在您的问题中,您似乎假设
MyClass
的客户机不以任何方式依赖于MyBase
,因此它必须是私有的,并且不会泄漏出MyClass
“我应该实现什么替代设计实践来避免添加引用?”不要在程序集中使用任何类型。如果以任何方式使用该类型(而不是通过引用编译时常量),则必须引用程序集。引用B中的类型和a中的基类型意味着您需要了解程序集a,否则编译器无法知道它提供了哪些成员。您没有解释的是为什么您不想让程序集C了解程序集A。我唯一的建议是让常见的事情变得普通。分离您的关注点,如果您处于这样的困境中,则是重构的时候了。我的意思是,您的业务逻辑和体系结构没有设计模式。如果你想把东西分成不同的项目,确保它们有一个合适的层次结构。如果你使用一个程序集,你必须引用它,否则编译器无法知道你想要它做什么。您使用的是派生类型,所以您使用的是程序集…基本上,我应该实现什么替代设计实践来避免添加该引用?没有。这里的问题是你试图做一些毫无意义的事情。您必须引用实例化所使用的类所需的所有程序集(句号)。无法提供更多建议,因为您尝试实现的内容不清楚(并且对于此格式来说可能太广泛)。可能重复
public sealed class MyClass
{
private MyBase myBase = ...;
}