【问题标题】:WCF Data Services with Custom Entities具有自定义实体的 WCF 数据服务
【发布时间】:2011-11-26 07:25:08
【问题描述】:

我有一组反映数据业务表示的自定义实体。然后我还有一组实体,它们一对一映射到表示数据存储的数据库。我的业务层在这两种类型之间进行转换并执行任何其他所需的逻辑。我只通过我的服务接口公开自定义对象。

据我所知,我无法使用 WCF 数据服务。数据服务

  1. 需要直接绑定到数据库源(或直接数据库连接的一些轻微抽象),并且,
  2. 这会导致使用数据实体。

如果我错了,请纠正我,但在使用我的业务层时,我看不到任何方法可以使用 WCF 数据服务及其对自定义实体的内置可查询性。

【问题讨论】:

  • 郑重声明,WCF 数据服务非常幼稚。我有一个基类,其中包含要在提要中公开的属性,还有一个具有附加属性的子类。当 WCF-DS 序列化为 ATOM 时,它会尝试序列化我的子类中的属性!它的反射算法不只是查看我正在处理的类类型中的属性。
  • 数据服务显然也无法将接口与其具体类型相匹配。如果您从 Entity 属性返回接口类型,如下所示: IQueryable 它会返回此错误: 内部服务器错误。 “SomeClass”类型不是复杂类型或实体类型。

标签: wcf wcf-data-services


【解决方案1】:

我不一定同意这一点。如果您查看http://msdn.microsoft.com/en-us/library/cc668794.aspx 中的架构概述,您会在 EF / DB 连接旁边看到另外两个选项。您可以拥有仅采用由可查询 CLR 类组成的替代(您的自定义)信息模型并使用 WCF 数据服务公开它们的数据服务提供者。

因此,如果您使用这种方法创建业务层,您的自定义实体可以很容易地通过 WCF 数据服务公开。

【讨论】:

  • 我应该说我确实让数据服务与我的业务实体一起工作。我有一个自定义 REST 服务,我基本上想将该功能公开为 OData。事实上,我实际上是通过调用我现有的 REST 端点来让数据服务工作的。问题是如果我想过滤我的订单,我必须从我的 REST 服务中获取所有订单,然后过滤它们,这是一个非常繁重的命题。理想情况下,我希望过滤发生在数据库级别,但我认为使用现有的业务和数据访问层是不可能的。
  • 恕我直言,您的自定义业务实体可以完全控制服务器端,以执行他们需要执行的任何操作来回答 OData 查询。由于这些查询允许包含过滤器语句,您的自定义实体是否无法在服务器端处理该过滤器操作?
  • 那种。我想这是我的问题。数据服务负责解析查询参数、构建查询并针对我的 IQueryable 属性执行它。我需要做的是能够自己解析查询参数并将它们传递到我的 DAL 中,以便可以针对我的查询执行它。正确的?如果我这样做,那么数据服务为我做了什么?
  • 为您提供基于单一标准的 OData 支持 Web 的界面,而您不必创建专门的服务操作和数据合同。这是值得的......
  • 您可以实现自己的 IQueryable 并编写访问者将表达式树转换为 DAL 可以理解的任何内容,而不是解析查询参数。这更好,因为这将您从 ODATA 协议中抽象出来。您无需担心 $filter、$orderby 语法,将简单表达式转换为 DAL 并不难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2011-04-14
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多