目前,有不少企业已经开始采用WCF来开发分布式系统,企业需求的这种分布式系统要求有着良好的可维护性以及可靠性。为了实现这一目标,开发团队必然选择架构良好的n层架构。参见下图:
ASP.NET页面层是WCF服务的一个消费者,大家都知道,WCF服务向消费者暴露终结点(Endpoint)以及数据契约(DataContract)。数据契约与业务实体一般有着相同的属性,但是数据契约做为与外界交互的消息(Message),它一般还有着消息头(MessageHeader),用于辅助与外界系统的通信。在实际的开发中,我们会在WCF服务层使用数据契约,而在业务处理层使用业务实体,而在WCF服务层内部引入转换层(Transform),它的职责就是将WCF服务层与业务处理层之间交互的数据契约与业务实体来回转换。而在企业的业务很复杂,数据契约、业务实体一般都是有很多属性的类型,那么如果我们手动写这样的MessageToEntity与EntityToMessage方法,那么一定会感觉到相当的枯燥乏味。这就是我做的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有兴趣,可以学习Microsoft的MSDN文档:
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!