问题描述
|
我继承了一个应用程序,该应用程序在逻辑上分为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();
}