【问题标题】:Using collections/lists within WCF DataContracts在 WCF DataContracts 中使用集合/列表
【发布时间】:2011-03-29 19:58:12
【问题描述】:

我对 WCF 不太了解...

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

在服务合同模型中,“系统”有一个“建筑物”属性,它是一个集合。 “建筑”也有“系统”的集合。

WCF 使用 DataSets 进行基础数据访问(使用 CRUD 的存储过程),并且我在 SYSTEM 和 BUILDING 之间有一个表来表示这种关系。

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

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

谢谢!

【问题讨论】:

  • 问题是什么 - 看起来您有一组可行的数据合同。哪个部分不能与你所拥有的一起工作?
  • 好吧,我不知道! :P 我想 DataSet 代码必须将行数据分配给属性集合(例如:系统中的建筑物)。为此,我想我需要一个适当的存储过程“GetSystems”来获取与之关联的建筑物的记录......但实际上,我不知道该去哪里。
  • 在同一个句子中使用 WCF 和 DataSet 已经让我感到恐惧了; DataSet 不是 WCF 代码的良好基础...
  • 同意!我的第一个想法是使用 WCF 的数据集和存储过程?是否可以选择迁移到 EntityFramework 或 NHibernate,或者该技术已经确定?
  • 是的,我同意你们俩的观点!我更愿意使用 EF,我旁边有 Julia Lerman 的书,但我正在修改一个现有项目,它是这样设计的……除了哲学考虑之外,有什么想法吗? :)

标签: c# wcf collections datacontract


【解决方案1】:

我认为这个问题过于宽泛,无法详细介绍,但我可以为您提供一些建议以帮助您入门。

  1. 忘记 WCF 并构建 数据访问层 (DAL)。这应该是一个包含查询数据库并返回强类型对象的代码的库。这个库可能包含一个名为 GetBuildings() 的方法,它返回一个 Building 对象的列表。该库可能适用于 DataSet(和其他数据库特定类型),但不应将 DataSet 暴露给外部调用者。
  2. 现在您已经有了一个可用于从数据库中获取数据的库,接下来编写 WCF 服务。服务组件中的代码应该调用 DAL 并将该信息转换为 DataContract 对象,以便通过 Web 服务边界发送。不要试图在 DataContract 对象中表示所有数据 - 您希望数据包相对较小,因此不要包含不需要的信息。与尝试尽可能少地调用 Web 服务来平衡这一点。在设计 DataContract 类时,请考虑客户端应用程序将如何处理数据。
  3. 编写服务客户端组件。这是调用 WCF 服务并将该信息转换为实体对象的代码。
  4. 最后(也是最有价值的一步)是编写客户端应用程序逻辑。现在,您将面临另一个关于如何构建客户端代码的问题(我建议使用 MVVM)。客户端应用程序应调用 Service Client 组件,并使用数据来满足您的应用程序的要求。

按照以上 4 个步骤,您应该最终得到:

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

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

【讨论】:

  • 这是一个很好的答案!但是,我的问题的目的是将一组子实体(例如:建筑物)放入父实体(例如:系统)中,反之亦然。我正在处理的现有项目有很多这种“垂直”方法的例子,就像你在你的步骤中解释的那样:从底部,使用数据库访问,到顶部,使用服务客户端。换句话说,我有一个“LINQ-to-SQL 风格”的实现,其中我的实体与数据表的 1:1 表示。我想要一种“实体框架风格”,我们可以在其中管理实体的一对多、多对多等表示。
  • 也许这只是不可能实现,如果是这种情况我会找到解决方法...
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2010-10-10
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多