向现有类集提供WCF接口

向现有类集提供WCF接口,wcf,Wcf,我继承了一个应用程序,该应用程序在逻辑上分为4层,但在物理上跨两层驻留。4个逻辑层是: asp.net网站 C#.Net程序集中的业务逻辑(从网站引用) 数据访问c#程序集-由codesmith工具生成的类(参考业务逻辑) sql server数据库 网站与业务层交互的方式示例如下: Booking b = new Booking(); b.property1 = x; b.property2 = y; result = b.method(); 它设置biz类的公共属性上的数据,然后执行一个

我继承了一个应用程序,该应用程序在逻辑上分为4层,但在物理上跨两层驻留。4个逻辑层是:

  • asp.net网站
  • C#.Net程序集中的业务逻辑(从网站引用)
  • 数据访问c#程序集-由codesmith工具生成的类(参考业务逻辑)
  • sql server数据库
  • 网站与业务层交互的方式示例如下:

    Booking b = new Booking();
    b.property1 = x;
    b.property2 = y;
    
    result = b.method();
    
    它设置biz类的公共属性上的数据,然后执行一个方法,该方法依次读取这些属性

    不幸的是,有很多属性,其中一些不是基本类型,它们是其他对象,例如Booking对象包含凭证对象的集合

    我需要将第2-4层提供给新的用户界面(一个非常不同的网站,将提供店内信息亭)

    我想通过WCF公开业务层。我创建了一个IBooking接口,定义了方法签名,并与[OperationContract]等进行了分离。我遇到的难题是如何管理数据。我意识到我可以定义一个数据契约来匹配预订对象的各种公共属性,但是我需要对现有网站进行重大更改,而不是设置属性并调用一个没有参数的方法,它需要填充数据契约的实例并将其作为参数传递对每个方法调用

    有谁能建议最好的方法来解决这个问题吗。我可以对现有网站进行更改,但我希望将这些更改保持在最低限度

    非常感谢,


    Rob.

    我建议实现这一点的最简单方法是围绕现有业务逻辑创建一个WCF包装器,而不改变当前网站。这可以在不改变已有代码的情况下完成。如果你认为它是“缺点”的话,那就是你现有的网站不会使用你的WCF服务。 您已经为该服务创建了合同。如果还没有,请为操作参数创建消息协定。然后,您可以通过使用服务合同和消息合同创建“新”网站

    服务与OO不同,因为您通常不设置属性,然后调用无参数方法,而是调用一个操作,同时包含任何相关的必需数据。您的服务实现(实现IBooking契约的类)将完成以下工作:

    • 实例化现有类
    • 填充这些对象
    • 调用无参数方法,以及
    • 返回结果
    e、 g


    为什么你不能像旧网站那样引用现有的程序集呢?谢谢Kirk,这似乎是最好的方法。
    // contract
    [OperationContract]
    MyResponseMessage DoMethod(MyResultRequest requestData);
    
    // and the implementing class (the 'service')
    public MyResponseMessage DoMethod(MyResultRequest requestData)
    {
        MyResponseMessage responseData = new MyResponseMessage();
    
        Booking b = new Booking(); 
        b.property1 = requestData.X; 
        b.property2 = requestData.y;
        responseData = b.method(); 
    }