Transformer 工具的由来及实现

目前,有不少企业已经开始采用WCF来开发分布式系统,企业需求的这种分布式系统要求有着良好的可维护性以及可靠性。为了实现这一目标,开发团队必然选择架构良好的n层架构。参见下图:


   ASP.NET页面层是WCF服务的一个消费者,大家都知道,WCF服务向消费者暴露终结点(Endpoint)以及数据契约(DataContract)。数据契约与业务实体一般有着相同的属性,但是数据契约做为与外界交互的消息(Message),它一般还有着消息头(MessageHeader),用于辅助与外界系统的通信。在实际的开发中,我们会在WCF服务层使用数据契约,而在业务处理层使用业务实体,而在WCF服务层内部引入转换层(Transform),它的职责就是将WCF服务层与业务处理层之间交互的数据契约与业务实体来回转换。而在企业的业务很复杂,数据契约、业务实体一般都是有很多属性的类型,那么如果我们手动写这样的MessageToEntityEntityToMessage方法,那么一定会感觉到相当的枯燥乏味。这就是我做的Transformer工具的由来。

   Transformer工具的开发主要使用了.NET平台中上反射(Refection)以及代码生成类库(CodeDom)Transformer主窗体的实现方法:

(1)    打开数据契约所在DLL,并反射该DLL中的所有类型,并根据类型的命名空间(Namespace)分组。然后将分组后的数据显示在一个TreeView中。

(2)    打开业务实体据有的DLL,做法同(1)

(3)    在两边的TreeView中分别选中一个类型,然后点击下面的”Generate” 按钮即可生成两边相互转换的代码。

Transform主窗体截图如下:


点击”Generate”按钮会生成Transformer代码:


 

那么代码是如何自动生成的呢?我们先看一下生成的代码示例:


示例代码可以看作生成代码的模板,我的实现思路如下:

首先要从转换的其中一个类中反射出其所有的属性,然后遍历其属性列表,在遍历过程中,查找另一个类中是否有同名且类型相同的属性,如果有就可以生成”msg.XXX=entity.YYY;”这样的赋值语句。当然,使用CodeDom我们可以生成这些代码。下面结合本工具使用到的情况介绍一下CodeDom:

CodeMemberMethod

        CodeMemberMethod有如下

        CodeMemberMethod的属性有:

               Attributes(MemberAttributes枚举):

ReturnType(CodeTypeReference):标识返回值的类型

               Name(string):标识方法的名字

               Parameters(CodeParameterDeclarationExpressionCollection):

               方法参数的集合

               Statements(CodeStatementCollection):

               方法体内语句的集合

        假如要产生下面的代码:

       

        那么使用CodeDom生成上面代码要使用的代码如下:


如果你对CodeDom有兴趣,可以学习MicrosoftMSDN文档:

http://msdn.microsoft.com/en-us/library/f1dfsbhc.aspx

 

     下面是Transformer工具的可执行程序及源代码的URI,有兴趣的不妨看一下:

     https://files.cnblogs.com/fuhongwei041/TransformerSourceCodeAndExe.rar

    

     That's all. Thank you for your reading!
 

 

posted on 2008-07-27 21:29  James.H.Fu  阅读(839)  评论(1编辑  收藏  举报

导航