zoukankan      html  css  js  c++  java
  • 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!
     

  • 相关阅读:
    从人群中看出真正优秀的人!
    新东方在厦门大学演讲--笔摘
    vuepress+gitee 构建在线项目文档
    二维码科普
    Linux访问Window共享文件夹的配置步骤
    SQL Server使用笔记
    Progress笔记
    Linux使用笔记
    Linux下配置mail使用外部SMTP发送邮件
    SaaS、PaaS、IaaS的含义与区别
  • 原文地址:https://www.cnblogs.com/fuhongwei041/p/1252765.html
Copyright © 2011-2022 走看看