我有一个公共类,MainObject位于类库(dll)中,对于此示例,我们将其称为BaseLibrary。
我有一个更高级别的类库,引用BaseLibrary来获取对其成员的访问权限。我们将这称为DeviceLibrary。
然后我有一个Windows窗体项目,DeviceControl,其中我添加了对DeviceLibrary的引用。
如果我需要使用MainObject对象,我该怎么做?我知道我可以在DeviceControl项目中添加第二个引用到BaseLibrary,但我只是想知道是否有另一种方法可以通过DeviceLibrary访问它?我不确定封装法则在这里有什么要求......
答案 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)
如果您能够更改库程序集的内容(即它是您的代码),那么您可以:
将MainObject
移动到单独的引用程序集中,并让任何现有程序集引用它。如果MainObject
实际上并不依赖于BaseLibrary的其他内容,则此方法很有效。
从MainObject
中提取接口,并将 放在参考库中,其他程序集都可以引用该参考库。然后是代码到界面,你只需要引用新的参考库。
如果无法更改库程序集的内容,则可以使用它自己的接口为MainObject编写包装器对象,并将选项2中的接口提取到引用库。
答案 3 :(得分:0)
免责声明:这并未完全解决您的问题。
通常在N层设计中,“模型”跨越所有层。以下是我在设计时参考的一个图表:http://i.msdn.microsoft.com/cc700340.fig01_L(en-us).gif
我不确定您的BaseLibrary包含哪些内容,但您似乎可能需要从DeviceLibrary中引用它。