2010-07-16 103 views
2

我有一个公共类,MainObject是在类库(dll)中,对于这个例子我们将其称为BaseLibrary。你可以通过两层组件访问一个对象吗?

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

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

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

回答

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任何暴露的基类或接口。

+0

你可以使用动态,但你(几乎肯定)不想。 – apollodude217 2010-07-16 18:27:46

0

声明:这并没有完全解决您的问题。

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

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

+0

有用的图表,你有链接到原来的上下文吗? – Paolo 2010-07-16 12:30:50

+0

@Paolo http://msdn.microsoft.com/en-us/magazine/cc700340.aspx – 2010-07-16 13:09:07

1

如果你能够改变库组件的内容(即它是你的代码),那么你既可以:

  1. 移动MainObject到一个单独的参考组装和任何现有的组件参考它。如果MainObject实际上并不依赖于BaseLibrary的其他内容,这很好。

  2. 摘自MainObject的接口,并把,在每一个其它组件可引用一个参考库。然后,您是否对代码进行了编码,您只需要引用新的参考库。

如果你不能改变库组件的内容,你可以采取书面MainObject一个包装对象,用它自己的接口和提取接口的参考库中选择2

3

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