3

我目前正在研究将我们当前的 WCF 数据服务 OData 提供程序转换为 Web API OData 的可行性。

我对 Web API 的 OData 实现有点困惑。使用 WCF 数据服务,它位于我们的 ADO.Net 实体模型的顶部,该模型从 SQL Server 后端公开一堆表,即您为 WCFDS 提供要生成的 ADO 模型,然后您可以通过标准访问所有表OData 语法。

到目前为止,通过所有阅读的 Web API,我们是否为要公开的每个表/对象创建一个控制器或单独的操作?我错过了什么吗?有没有一种方法可以让 OData Web API 控制器从 ADO 数据模型中公开整个模型?必须为每张桌子创建一个动作将是一团糟和矫枉过正。

目前,如果我们需要添加一个表,我们只需将其映射到 EDMX 中,WCFDS 将在它映射到模型的整个上下文时自动公开它。

4

1 回答 1

3

生成模型

你可以:

  • 使用 ASP.NET Web API 中的约定模型生成器。这会生成与 EF 自己的约定模型生成器生成的模型不同的模型:EdmLib IEdmModel。如果您使用的是模型优先或数据库优先,请参阅此问题。这种方法似乎真的倒退了,而且确实如此,但它主要是有效的。
  • 序列化 EF 模型并将其重建为IEdmModel(请参阅此问题)。同样,这确实是低效的。如果您使用的是模型优先或数据库优先,您只需反序列化 EDMX 文件即可构建IEdmModel. 它仍然在内部生成不同的模型,但至少 CDSL 是一种比 CLR 代码约定更稳定的格式,因此与使用两个不同的基于约定的模型构建器相比,您可能会遇到更少的惊喜。

原因是 ASP.NET Web API OData 扩展使用 EdmLib,而 EF 使用自己的代码,并且没有计划让它们一起工作。如果你好奇的话,也许你会发现这个咆哮很有用。

处理 API

一旦你从一个独特的来源生成了模型(这样你就可以从一个地方处理你的模型),你实际上必须为每个实体创建一个控制器,基本上。Web API 的重点不是自动构建事物,而是为开发人员提供灵活性。这EntitySetController有助于减少冗余,但它不会提供开箱即用的一切。

退后一步

在上面提到的咆哮中,我还谈到了服务层API 和数据层API 之间的区别。ASP.NET Web API 更适合服务,而 OData 使服务变得笨拙。另一方面,OData 使数据访问变得轻而易举(本质上就像 RESTful SQL),并且由于直接附加到数据模型,可以自动化很多事情,就像您在 WCF 数据服务中看到的那样。带有 OData 扩展的 ASP.NET Web API 位于中间,它的价值并没有得到普遍认可(尽管在服务 API 上使用某些 OData URI 语法肯定很有用)。

不要被最近围绕 ASP.NET Web API 的热议炒作,它和 WCF 数据服务是非常不同的野兽,并且在您的设计中运行在不同的层上。实际上,在多层架构中,您很可能会看到使用 ASP.NET Web API 构建的服务 API 位于使用 WCF 数据服务构建的 OData API 之上。

我的建议是仔细考虑您要构建的内容,并根据答案选择 ASP.NET Web API 并接受您公开的 API 与以数据为中心的 OData API 非常不同的事实,或者坚持使用 WCF 数据服务。

一个可能的计划

您可以通过搜索“非 CRUD web/RESTful/hypermedia API”之类的术语或比较诸如 ServiceStack 之类的产品(提倡较少面向数据的 API),在网络上找到很多关于服务层 API 的材料。

如果您仍然不确定项目的性质,请将其原型化。

  • 如果你最终得到了一堆本质上相同的带有 Web API 的控制器,每个控制器都映射到一个实体,那么你的 API 很大程度上是面向数据的。使用 WCF 数据服务
  • 如果您最终使用 WCF 数据服务获得大量 OData 操作和笨拙的实体,那么您需要在 API 的服务器端提供更多的域逻辑,而面向数据的功能不足以满足您的需求。使用 Web API。一个好的经验法则是像对待 SQL DBMS 中的存储过程一样对待 OData 操作。实际上,将任何 OData 服务器视为 DBMS,因为它们就是这样。如果您不将其放在 SQL 接口后面,请不要将其放在 OData 接口后面。

重要(更新)

2014 年 3 月 27 日宣布,Microsoft 将停止使用WCF 数据服务,转而使用 ASP.NET Web API。为了处理我在这里公开的“数据层”用例,微软表示它计划扩展 ASP.NET Web API。一些社区的 努力也在进行中。WCF 数据服务也将在某个时候开源,因此新的维护者将接管并非不可能,尽管还不确定。

于 2013-11-07T17:22:42.370 回答