你能通过两层组件访问一个对象吗?

时间:2010-07-16 11:51:41

标签: c# assemblies encapsulation class-library

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

我有一个更高级别的类库,引用BaseLibrary来获取对其成员的访问权限。我们将这称为DeviceLibrary。

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

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

4 个答案:

答案 0 :(得分:3)

来添加引用。如果不这样,那么编译器会抱怨并告诉您添加引用。使用Reflection hacks应该是一个非常遥远的第二选择,它只会使你的代码变慢并且仍然不会删除对DLL的运行时依赖性。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

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

我不确定您的BaseLibrary包含哪些内容,但您似乎可能需要从DeviceLibrary中引用它。