如何避免引用仅包含基类的程序集?

时间:2018-04-17 13:15:12

标签: c# oop inheritance

我的课程结构如下:

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; }
}

AssemblyB.dll和AssemblyC.dll中使用了具体类MyClass

目的:

  • 参考文献应该只是从A到B到C的一种方式。
  • 引用应该是顺序的,C只应该引用B和B应该只引用A。

AssemblyA.dll正用于多个项目。 这就是InternalsVisibleToAttribute无法使用的原因。 因此,如果我在AssemblyA中创建成员internal并实现InternalsVisibleToAttribute属性,那么这些只能在AssemblyB中可见;这不行。 我仍然可以修改AssemblyA ,但不应将更改明确定位到特定项目。

其他两个组件(B和C)仅由一个项目使用。所以,我可以用任何方式改变它们。

1 个答案:

答案 0 :(得分:0)

另一种设计方法是使用组合而不是继承:

public sealed class MyClass
{
    private MyBase myBase = ...;
}

如果您的设计确实使AssemblyC能够在不知道MyClass的情况下对MyBase做任何合理的事情,那么必须能够在不知道如何初始化{{1}的情况下实例化MyClass }}。因此,MyBase应该包含这些知识本身或在DI的帮助下。

在您的问题中,您似乎认为MyClass的客户不会以任何方式依赖MyClass,因此必须将其设为私有且不会泄​​漏MyBase