我的课程结构如下:
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
。
目的:
AssemblyA.dll正用于多个项目。
这就是InternalsVisibleToAttribute
无法使用的原因。
因此,如果我在AssemblyA中创建成员internal
并实现InternalsVisibleToAttribute
属性,那么这些只能在AssemblyB中可见;这不行。
我仍然可以修改AssemblyA ,但不应将更改明确定位到特定项目。
其他两个组件(B和C)仅由一个项目使用。所以,我可以用任何方式改变它们。
答案 0 :(得分:0)
另一种设计方法是使用组合而不是继承:
public sealed class MyClass
{
private MyBase myBase = ...;
}
如果您的设计确实使AssemblyC能够在不知道MyClass
的情况下对MyBase
做任何合理的事情,那么必须能够在不知道如何初始化{{1}的情况下实例化MyClass
}}。因此,MyBase
应该包含这些知识本身或在DI的帮助下。
在您的问题中,您似乎认为MyClass
的客户不会以任何方式依赖MyClass
,因此必须将其设为私有且不会泄漏MyBase