在WCF DataContracts中使用集合/列表

时间:2011-03-29 19:58:13

标签: c# wcf collections datacontract

我不太了解WCF ...

我想做一份干净的工作,使用DataContracts为客户端的实体提供服务。想象一下两个DataContracts“系统”和“建筑物”:“系统”可能有许多“建筑物”,“建筑物”可能有许多“系统”。所以,我们之间有多对多的关系。

在服务合同模型中,“系统”具有作为集合的“建筑物”属性。 “建筑”也有一系列“系统”。

DataContracts

WCF使用DataSet进行基础数据访问(使用CRUD的存储过程),我在SYSTEM和BUILDING之间有一个代表关系的表。

Database tables

那么,我该如何干净地实现这个场景呢?我希望客户能够在“系统”中获得“建筑物”的简单表示,例如,我可以使用:

system = GetSystem(id);
foreach (Building building in system.Buildings) {
    // do whatever with each buildings...
}

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这个问题太宽泛,无法详细介绍,但我可以给你一些指导,让你开始。

  1. 忘记WCF并构建数据访问层(DAL)。这应该是一个库,其中包含查询数据库和返回强类型对象的代码。该库可能包含一个名为GetBuildings()的方法,该方法返回一个Building对象列表。该库可能与DataSet(以及其他特定于数据库的类型)一起使用,但不应将DataSet公开给外部调用者。
  2. 既然您有一个可用于从数据库获取数据的库,请编写 WCF服务。服务组件中的代码应调用DAL并将该信息转换为要通过Web服务边界发送的DataContract对象。不要试图在DataContract对象中表示所有数据 - 您希望数据包相对较小,因此不要包含不需要的信息。通过尝试尽可能少的Web服务调用来平衡这一点。在设计DataContract类时,请考虑客户端应用程序将对数据执行的操作。
  3. 编写服务客户端组件。这是调用WCF服务的代码,并将该信息转换为实体对象。
  4. 最后(也是最有意义的一步)是编写客户端应用程序逻辑。现在你有另外一个问题来面对你将如何构建客户端代码(我建议使用MVVM)。客户端应用程序应调用Service Client组件,并使用这些数据来满足应用程序的要求。
  5. 按照上述4个步骤,您最终应该:

    • 与数据库通信的数据访问层。
    • 服务层,它对数据库一无所知,但能够从数据访问层获取数据。
    • 服务客户端层,它对数据库一无所知,但知道如何从服务层获取数据。
    • 应用程序代码,它对数据库或Web服务一无所知,但调用Service Client层来获取数据并将数据呈现给用户界面。

    每个人都会以不同的方式做到这一点,但主要的是通过使用分层架构来区分问题。