为现有的类提供WCF接口

问题描述

| 我继承了一个应用程序,该应用程序在逻辑上分为4层,但实际上位于两层之间。 4个逻辑层是: asp.net网站 C#.Net程序集中的业务逻辑(从网站引用) 数据访问C#程序集-Codesmith工具生成的类(从业务逻辑引用) sql服务器数据库 网站与业务层交互方式的一个示例是:
Booking b = new Booking();
b.property1 = x;
b.property2 = y;

result = b.method();
即。它在biz类的公共属性上设置数据,然后执行一个属性中依次读取的方法。 不幸的是,有很多属性,其中一些不是基本类型,它们是其他对象,例如,Booking对象包含Vouchers对象的集合 我需要使2-4层可用于新的用户界面(一个完全不同的网站,该网站将提供店内服务亭)。 我想通过WCF公开业务层。我创建了一个IBooking接口,定义了方法签名,并用[OperationContract]等修饰。我遇到的问题是如何管理数据。我意识到我可以定义一个数据合同来匹配Booking对象的各种公共属性,但是然后我需要对现有网站进行重大更改-而不是它设置属性调用没有参数的方法,而该参数需要填充数据协定的实例,并将其作为参数传递给每个方法调用。 任何人都可以建议最好的方法解决这个问题。我可以对现有网站进行更改,但我希望将这些更改降至最低。 非常感谢, 抢。     

解决方法

我建议实现此目的的最简单方法是围绕现有的业务逻辑创建WCF包装,而无需更改当前网站。无需对现有内容进行任何(重大)代码更改即可完成此操作。如果您认为这样的话,“缺点”是您现有的网站将不会使用WCF服务。 您已经为该服务创建了合同。如果尚未创建,请为操作参数创建消息合同。然后,您可以通过使用服务合同和消息合同来创建\'new \'网站。 服务与OO不同,因为您通常不设置属性然后调用无参数方法-而是调用一个操作并同时包含任何相关的必需数据。您的服务实现-实现IBooking合同的类-将完成以下工作: 实例化现有课程 填充那些对象 调用无参数方法,以及 返回结果。 例如
// 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(); 
}