【问题标题】:How to avoid referencing assembly that only contain base class?如何避免引用只包含基类的程序集?
【发布时间】: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


【解决方案1】:

另一种设计实践是使用组合而不是继承:

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

如果您的设计确实使 AssemblyC 可以在不知道 MyBase 的情况下使用 MyClass 做任何明智的事情,那么必须可以在不知道如何初始化 MyBase 的情况下实例化 MyClass。因此,MyClass 应该在其自身或在 DI 的帮助下包含这些知识。

在您的问题中,您似乎假设MyClass 的客户不以任何方式依赖MyBase,因此它必须是私有的并且不会从MyClass 泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多