2

我有一个公共类 MainObject,它位于类库 (dll) 中,在本示例中,我们将其称为 BaseLibrary。

我有一个更高级别的类库,它引用 BaseLibrary 来访问它的成员。我们将其称为 DeviceLibrary。

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

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

4

4 回答 4

3

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

于 2010-07-16T14:15:15.747 回答
1

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

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

dynamic x = MethodReturningAMainObject();
x.Foo(); //this will be compiled to use reflection to find "Foo"

除了使用动态或object引用之外,您还可以使用任何公开的基类或适用于MainObject.

于 2010-07-16T11:58:43.667 回答
1

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

  1. 移动MainObject到一个单独的参考程序集并让任何现有程序集引用它。如果MainObject实际上不依赖于 BaseLibrary 的其他内容,则此方法效果很好。

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

如果您无法更改库程序集的内容,则可以诉诸为 MainObject 编写一个包装器对象,使用它自己的接口,并将接口提取到参考库,如选项 2 所示。

于 2010-07-16T12:41:25.607 回答
0

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

通常在 N 层设计中,“模型”跨越所有层。这是我在设计时参考的一张图表:http: //i.msdn.microsoft.com/cc700340.fig01_L (en-us).gif

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

于 2010-07-16T12:20:13.757 回答