C# 可以通过两层组件访问对象吗?

C# 可以通过两层组件访问对象吗?,c#,assemblies,encapsulation,class-library,C#,Assemblies,Encapsulation,Class Library,我有一个公共类,MainObject,它位于类库dll中,在这个示例中,我们称它为BaseLibrary 我有一个更高级别的类库,它引用BaseLibrary来访问它的成员。我们称之为“设备图书馆” 然后我有一个Windows窗体项目DeviceControl,在其中我添加了对DeviceLibrary的引用 如果我需要使用MainObject对象,我该怎么做?我知道我可以在DeviceControl项目中将第二个引用添加到BaseLibrary,但我只是想知道是否有其他方法可以通过Device

我有一个公共类,MainObject,它位于类库dll中,在这个示例中,我们称它为BaseLibrary

我有一个更高级别的类库,它引用BaseLibrary来访问它的成员。我们称之为“设备图书馆”

然后我有一个Windows窗体项目DeviceControl,在其中我添加了对DeviceLibrary的引用


如果我需要使用MainObject对象,我该怎么做?我知道我可以在DeviceControl项目中将第二个引用添加到BaseLibrary,但我只是想知道是否有其他方法可以通过DeviceLibrary访问它?我不确定这里的封装法则规定了什么…

在代码中引用的任何类型都必须是直接引用的程序集的一部分

虽然通常不实用,但可以使用System.Object引用并使用反射来调用其成员,而无需直接引用Main对象。在C 4.0中,您可能只需要使用dynamic关键字:


除了使用动态或对象引用外,您还可以使用任何应用于MainObject的公开基类或接口。

免责声明:这并不能完全解决您的问题

通常在N层设计中,模型跨越所有层。以下是我在设计时参考的一个图表:


我不确定你的BaseLibrary包括什么,但似乎你必须从你的DeviceLibrary中引用它

如果您能够更改库程序集的内容,即它是您的代码,那么您可以:

将MainObject移动到单独的引用程序集中,并使任何现有程序集引用它。如果MainObject实际上不依赖于BaseLibrary的其他内容,那么这种方法很有效

从MainObject中提取接口并将其放置在每个其他程序集都可以引用的引用库中。然后是对接口的代码,您只需要引用新的参考库


如果无法更改库程序集的内容,可以使用MainObject自己的接口为其编写包装器对象,并将接口提取到引用库中,如选项2所示。

您必须添加引用。如果您不这样做,编译器会抱怨并告诉您添加引用。使用反射黑客应该是一个非常遥远的第二选择,它只会使您的代码变慢,而且仍然无法删除对DLL的运行时依赖关系。

有用的图表,您是否有指向原始上下文的链接?您可以使用动态,但您几乎肯定不想使用。
dynamic x = MethodReturningAMainObject();
x.Foo(); //this will be compiled to use reflection to find "Foo"