我已经在.NET中完成了几个小的个人项目,并且根据SO的建议决定做一些更先进的事情,以便我可以随时学习。
目前我正在编写一个项目来增强现有的第三方库,以便我将编写的另一个应用程序可以更容易地使用它的对象。
在第三方库中,我专注于一个对象,我们称之为DataSource
,而这又包含与数据库相关的结果。对于一个小例子(这里的对象有更多的方法和属性没有显示),它有一个属性的“树”如下:
A_DataSet -> A_Result -> A_Dimensions() -> A_Dimension -> A_SetDisplayType(DisplayAs)
此处Result
对象有一个名为Dimensions
的属性,其中包含Dimension
的集合。最后,每个Dimension
都有一个名为SetDisplayType
的方法,它控制Dimension
中另一个属性中包含的数据的显示。为了本示例的目的,这些元素以A_
为前缀。
现在,由于第三方库的方法和属性有时令人困惑,而且本质上很多,我想为这个库创建一个“包装器”,以便简化其使用和结构。在对如何更加逻辑地组合元素进行了相当多的考虑后,我想到了以下方向:#/ p>
B_DataSet -> B_Dimensions() -> B_Dimension -> B_DisplayProperties -> B_SetDisplayType(DisplayAs)
在这个例子中,我用B_
为对象加上前缀,只是为了区别于上面的现有元素,当然这不是最终的命名约定(实际上命名对于这个问题的目的并不重要) )。
我坚持的观点是我应该如何从包装类中正确引用第三方对象(A_ *)。例如,如果我想使用B_SetDisplayType
,那么这将在内部调用A_SetDisplayType
。但是,由于A_SetDisplayType
属于A_Dimension
,因此我需要在A_Dimension
中引用B_DisplayProperties
。
在创建对象时,是否可以在构造函数中向它们传递对“父”的引用?我正在考虑类似下面的代码:
Public Class DataSetDisplayProperties
Private _A_Dimension as A_Dimension
Public Sub New(MyDimension as A_Dimension)
_A_Dimension = MyDimension
End Sub
Public Sub B_SetDisplayType(DisplayAs as Integer)
Call _A_Dimension.A_SetDisplayType(DisplayAs)
End Sub
End Class
这看起来不错,还是有更好的方法?
我正在考虑使用外观,但当我尝试将不同“级别”的方法引用到现有结构时,我不确定这是如何工作的。
请注意,我不能从任何第三方类继承,也不能更改它们的代码。
如果上述内容看起来有些混乱,我很抱歉,我想我可能不知道如何表达我的问题的正确术语。谢谢!
答案 0 :(得分:0)
这似乎不是这个问题的答案,当然不是直接问题,而是和我在一起。首先,当你说你想要建立一个Facade时,我认为你是对的。我是否可以建议您使用测试驱动开发方法为此外观开发接口,然后您可以专注于如何使用第三方库实现该接口。这将使您能够清楚地了解第三方库的特性和命名约定,并完全专注于想要提供的界面以及您希望它实现的目标。它还将为您的Facade实现提供单元测试套件。
如果您之前没有使用过TDD,那么您需要经历一段曲线,但我可以向您保证这笔投资是值得的。在工具方面,我推荐使用NUnit和MOQ。您可能还需要一个IoC容器,如Unity 2.0。
祝你好运!