• 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!
     

  • 相关阅读:
    测试发帖
    C# 四舍五入算法(转)
    赚钱,爱好,生活
    c# 当前dll目录
    BlogWriter
    调用com+时,提示 0x800706f7,error msg:占位程序接收到错误数据,(本地调用时提示:不支持此接口)
    测试2
    系统架构设计 & 避免循环引用(转载)
    Visual Studio 2008查找替换用的正则
    Myeclipse webinf/lib包加载问题
  • 原文地址:https://www.cnblogs.com/fuhongwei041/p/1252765.html
Copyright © 2020-2023  润新知