为现有的一组类提供WCF接口

时间:2011-05-25 21:32:42

标签: wcf

我继承了一个逻辑上分为4层的应用程序,但实际上存在于两个层中。 4个逻辑层是:

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

    Booking b = new Booking();
    b.property1 = x;
    b.property2 = y;
    
    result = b.method();
    

    即。它设置biz类公共属性的数据,然后执行一个方法,该方法又从属性中读取。

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

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

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

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

    非常感谢,

    罗布。

1 个答案:

答案 0 :(得分:2)

我建议最简单的实现方法是在不改变当前网站的情况下围绕现有业务逻辑创建WCF包装器。这可以在没有任何(重大)代码更改的情况下完成。如果您认为这样,“缺点”是您现有的网站不会使用您的WCF服务。

您已经为该服务创建了合同。如果尚未创建,请为操作参数创建消息协定。然后,您可以通过使用服务合同&创建“新”网站。消息合同。

服务与OO不同,因为您通常不设置属性&然后调用无参数方法 - 而是调用一个操作并同时包含任何相关的所需数据。您的服务实现 - 实现IBooking合同的类 - 将完成

的工作
  • 实例化现有的课程
  • 填充这些对象
  • 调用无参数方法,
  • 返回结果。

e.g。

// 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(); 
}