none
关于WCF数据契约与实体(Model/Entity)转换(或共享)问题 RRS feed

  • 问题

  •    问题比较肤浅,还请各位大侠指导!

     

    对于客户端和服务端全部由自己的开发团队开发的情况下,WCF服务端的数据契约与实体(Model/ Entity)转换(或者说共享)用什么方式比较合适?如:WCF服务端采用简单三层方式(Service/BLL->DAL->…),不用ORMEntity Framework

            

    方案1WCF的数据契约只到WCF服务层,与实体完全是分开(Model/ Entity),中间增加一个数据契约到实体的适配层,数据契约通过适配层转换到1个或多个实体(Model/ Entity),实体也可以经过适配器转换成数据契约。

    优点无需多说,从设计的角度来说比较清晰,缺点就是可能比较多的时候,数据契约和实体代码基本重复,增加一个适配器也增加开发的成本。

     

    方案2:共享WCF数据契约,也就是数据契约同时作为一个数据传递对象DTO,从WCF服务层一直传递到业务逻辑层/数据访问层,业务逻辑层/数据访问层也可以直接返回这个DTODTO既是数据契约,也是实体(Model/ Entity)。

             此方案的优点是减少了重复的数据契约和实体(Entity/Model)代码,也无需转换适配器,弊端是耦合紧密,不好适应变化,同时将数据层的实体暴露出来了。

     

    附带问题:

    1、在客户端(如WinForm),也要有一份类似DTO或实体的拷贝,客户端若直接引用后台服务中的Model层(发布客户端时将Model.DLL随同发布)好像也不合适。

    2、后台WCF服务层,是不是可以理解为和常规意义上的BLL层是一样的,也就是说WCF ServiceBLL层,对外实现WCF的服务/操作契约(如IService),向下则调数据访问(DAL)的接口,如IDAL之类的。

     

    不知道大家实际项目中都是如何应用的,有什么合适的实现方案或建议请多指导下,非常感谢!

    2011年6月1日 5:35

答案

  • WCF如果用来开发服务程序,首先要注意的问题 其实就是 Web服务程序要和客户端系统的低耦合性。

    你说的2个方案,实际都是针对 WCF服务如何与系统内部各层之间的交互问题。

    方案1 和方案2 都有使用的。而且数据契约里也提供了 DataMember属性标记 来控制属性的 可序列化性。

    但是推荐的做法是 方案1.

    WCF服务 开发的服务层 实际是对外部系统 提供的一个标准的API,也就是接口。

     

    附带的问题是,

    1.客户端Winform程序 不要直接 和WCF背后的系统共用Model或者数据契约。这违背了SOA的原则。服务只共享契约而不是特定的技术框架下的类型定义

    2.WCF服务层,就是一层服务,严格来说是对于BLL业务逻辑的一层再包装,暴露出去的接口,供其它系统调用。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    • 已标记为答案 pipzeng 2011年6月3日 0:06
    2011年6月2日 3:50
    版主

全部回复

  • WCF如果用来开发服务程序,首先要注意的问题 其实就是 Web服务程序要和客户端系统的低耦合性。

    你说的2个方案,实际都是针对 WCF服务如何与系统内部各层之间的交互问题。

    方案1 和方案2 都有使用的。而且数据契约里也提供了 DataMember属性标记 来控制属性的 可序列化性。

    但是推荐的做法是 方案1.

    WCF服务 开发的服务层 实际是对外部系统 提供的一个标准的API,也就是接口。

     

    附带的问题是,

    1.客户端Winform程序 不要直接 和WCF背后的系统共用Model或者数据契约。这违背了SOA的原则。服务只共享契约而不是特定的技术框架下的类型定义

    2.WCF服务层,就是一层服务,严格来说是对于BLL业务逻辑的一层再包装,暴露出去的接口,供其它系统调用。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    • 已标记为答案 pipzeng 2011年6月3日 0:06
    2011年6月2日 3:50
    版主
  • 多谢版主指点,学习了!

    2011年6月3日 0:06
  • 谢谢指点。向你们学习。
    2011年6月3日 1:53
  • 多谢,看来一直是我理解错误了。还好现在改正还来得及。
    2012年11月16日 13:11