对通用XMl配置文件的理解和心得
最近读了博主”无待“写的关于通用配置文件的博客以及对应的代码的实现思路,现在”狗尾续貂“,在作者的基础上谈谈自己对通用配置文件的理解和心得。
首先,介绍一下通用配置文件的功能,通用配置文件主要是实现对应的Xml文件和对应的对象之间的转换关系,利用该工具用户只需要定义对应的对象以及对应的XMl文档的结构,便可以调用对应的方法实现两者之间的对应转换。该功能主要用于对于系统的配置文件的编写以及对应的系统实现流程方案等的配置的管理。
在博主的博客里面,博主采用”需求——>设计——>实现——>重构”的实现流程对该工具的功能和实现做了介绍,并提供了对应的源码下载,博主的访问地址为:http://www.cnblogs.com/qingteng1983/archive/2010/06/20/1761437.html。在这里我也基于这个流程谈谈自己的一些理解。
首先,由于每个对象都需要实现对应的将自身转化为对应的XMl文件,以及从对应的XMl文件提取对应的信息的方法,因此设计实现了首先定义了对应的类需要实现的接口,IXMLStorage 其中该接口里面包含了两个方法为SetValToXMl (XMlObject ,XmlNode)和GetValFromXMl(XMlObject,XMlNode)分别实现了对应的XMl节点和对应对象之间的转换关系。这样作者为每个需要实现对应的和XMl文件转换的对应实现了对应的转换方法。当是实现以后,该工具类还是没办法实现对应的对象和XMl文件之间的转换的完全通用的功能,需要在每个类里面是实现对应的方法,而对应的实现该方法的过程和对象自身的信息紧密相关。当是我们可以发现对应的实现这两个方法的过程对应的逻辑完全相同,并且该方法中用到的对象的差异信息也都是对应的对象的Public字段和对应的成员,因此博主提出了利用“反射”来实现该方法的思路,对于对应方法里面用到的信息,都可以通过对相应的对象进行反射进行获取。
因此,我们可以将原先的设计思路修改为:

及实现的过程在原先的基础上首先加入一个实现了对应的IXMlstorsge的基类,在基类里面实现了对应的XMl文件的对象之间的转换的方法,这样对应的子类继承了XMlStorage后便有了对应的转换的方法。其中在对应的基类实现对应的转换方法的过程中主要用到了上文提到的“反射”,对于对象的属性都通过对应的对该类利用反射功能获取对应的属性及成员集合。实现的过程中对对应的对象类型的获取可以通过基类方法中This.GetType()方法进行获取,其中里面还涉及到了对应的属性类型的判断等问题的处理,主要通过获取对应的对象实现的接口进行获取type.GetInterfaces();这样若对应的对象实现了ICollection接口该属性变为对应的集合属性,具体的实现过程可参考博主对应的介绍及源码。
基于以上的继承可以实现对应的通用配置文件的方法,当是博主在可以没有采用对应的继承的实现方法,而是采用了“装饰者模式“,定义了XMlStorageHelp工具类来实现对应的对象和XMl配置文件的转换,这样用户变不在需要继承,只需要将对应的XMlObject对象和XMlNode传递给该工具类,变可以实现两者之间的转换关系。
采用”中介者模式“于采用继承的方式里面对应的实现过程都是相同的,当采用”装饰者模式“带来的主要优点有:
1.避免了对象之间的继承关系,需要实现转换关系的对象和对应的基类之间在业务上,逻辑上没有明显的继承关系,只是为了实现相同的接口,采用了对应的继承关系,业务上有些勉强。
2.使对象的职责单一。采用”中介者模式“后,对应的对象便不再需要实现对应的对象和Xml文件之间的转换关系了,对应的功能职责更明确了。
3.代码更灵活了。基于继承关系,对应的对象要实现XMlObject和XMlNode的转换关系,必须继承基类,而现在对应的对应不需要任何限制,只要将对应的对象类型传递给对应的XMlStorage类即可。
总结:通用配置工具实现了Objetc 和XMl文件之间的通过转换功能,其中用到的技术主要有:
1.”反射“,转换工具提供的转换方法的参数类型为Type类型,通过”反射“获取对应对象的属性信息。
2.工厂模式:通用配置工具类将对应的对象都抽象为Type,实现转换时,根据真实的对象的类型信息创建对应的子节点并设置对应的属性信息。
3.”中介者模式“:将对应的转换方法,提取出来放到单独的类里面,为该类传递对应的要转换的对象。
4.递归的思想:程序在实现对应的转换关系的过程中对里面包含的子对象也实现了对应的一系列转换。
以上是自己对博主”无待“设计的关于实现Xml通用配置文件的实现的一些理解和对应的心得,对于该工具的详细介绍还请参见博主的博客。另外对于博主提到的对应的集合和对应字典的实现,这块还没弄明白。同时大家也提出了利用.Net提供的序列化工具来实现对应的功能,其中采用序列化正如博主所讲,对应的子对象都要实现对应的序列化功能,另外对于序列号如何保存对应的XMl文件还需要学习。
浙公网安备 33010602011771号