none
兄弟我在研究wcf,整理了一个思路,不知道是否有可行性 RRS feed

  • 问题

  • 1.首先定义一个消息体

    ''' <summary>
    ''' 数据传输消息格式
    ''' </summary>
    <Serializable()> _
    Public Class Info

       Public Property URL() As String' 路由信息

       Public Property Code() As String'错误信息

       Public Property [Error]() As String'用户编码

       Public Property UserID() As String

       Public Property DataSet() As DataSet'DataSet数据

       Public Property OBJ() As Byte()'传递的对象(实体、泛型集合、其他Object

    End Class

    说明:
    URL用于反射定位该消息的处理方法
    URL的格式类似于 【WinMis://UserManage/Users@GetList】
    UserManage是DLL类库的名称
    Users是UserManage中的一个实现类
    GetList是Users中的一个实现方法
    通过解析这个URL,就可以反射相关的类库动态调用相关方法

    2.流程
    [客户端]
    客户端Winform收集数据整理成消息格式
    1)设置消息体OBJ()属性.
    因为wcf不能直接传输Object,所以要把相关的业务实体类/泛型集合序列化成byte()类型来传输
    2)设置消息体URL()属性.类似于WinMis://UserManage/Users@GetList
    3)设置消息体DataSet()属性,如果服务器端业务逻辑处理的是dataset,那么就设置dataset属性来存储数据
    填充消息体后调用wcf的方法
    [wcf]
    wcf接收到消息体后,根据消息体的url路由反射UserManage程序集中的Users类中的GetList方法.类似于
    Namespace UserManage

        Public Class Users

            Public Function GetList(ByVal info As Info) As Info
                '反序列化info中obj()
                '处理相关业务流程
                '返回处理完毕的info
                Return info
            End Function

        End Class

    End Namespace
    4)wcf将处理的结果(Info)返回给客户端.客户端部分接收处理完毕的数据

    这个方案的优缺点
    优点:实现业务逻辑和前端数据展示彻底分离.客户端和服务端都可以采用插架式开发.当系统需要扩展时候只需要部署相关的dll到服务器端和客户端即可.中间的wcf不需要重新编译.wcf也无需编写大量的接口和实现方法.
    缺点:客户端和服务器端业务逻辑的相关处理方法传递的参数都必须是Info类.无形中加大了开发成本。

     

    虚心请教:这个方案是否可行,如果可行还需要注意哪些问题?

    2010年10月19日 2:49

答案

  • 可行,思路没问题。

    你想做出统一的接口。这个是设计上的目标。

    但是。缺点也很明显。

    1.DLL共享与客户端和服务端,实际上还是高耦合。如果服务端使用了新的数据,客户端必须知道。否则无法处理

    2.DataSet的使用,它的序列化一直是个问题,包含了许多不必要的属性等数据,会影响性能。


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

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

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

    • 已标记为答案 Mog Liang 2010年10月26日 7:48
    2010年10月20日 2:14
    版主