目前,我正在研究将当前的WCF数据服务ODATA提供商转换为Web API ODATA的可行性。

我对Web API的ODATA实现感到有些困惑。使用WCF数据服务,它位于我们的ADO.NET Entity模型的顶部,该模型从SQL Server后端暴露了一堆表ODATA语法。

到目前为止,借助所有阅读的Web API,我们是否会为我们要公开的每个表/对象创建一个控制器或单独的操作?我想念什么吗?是否有一种方式,ODATA Web API控制器只能从ADO数据模型中公开整个模型?必须为每张桌子创建一个动作将是一团糟和过度杀伤。

当前,如果我们需要添加表格,我们只会在EDMX中映射它,WCFD将自动将其公开,因为它已映射到模型的整个上下文中。

有帮助吗?

解决方案

生成模型

你可以:

  • 使用 会议模型构建器 来自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和A。 数据层 API。 ASP.NET Web API更适合服务,而ODATA使服务尴尬。另一方面,ODATA使数据访问变得轻而易举(本质上像是一个静止的SQL),并且由于直接将其连接到数据模型,可以自动化很多东西,就像您在WCF数据服务中看到的那样。带有ODATA扩展的ASP.NET Web API位于中间,其价值并未普遍达成共识(尽管使用Service API上的某些ODATA URI语法肯定是有用的)。

不要因为最近围绕ASP.NET Web API的嗡嗡声而大肆宣传,IT和WCF数据服务是非常不同的野兽,并且在设计中的不同层上运行。的确,在多层体系结构中,您可以很好地看到使用ASP.NET Web API构建的服务API,位于使用WCF数据服务构建的ODATA API顶部。

我的建议是仔细考虑您要构建的内容,并取决于答案,要么选择ASP.NET Web API,并接受这样一个事实,即您所公开的API与以数据为中心的ODATA API有很大不同,或者坚持下去使用WCF数据服务。

可能的计划

您可以通过搜索诸如“ non-Crud Web/Restful/HyperMedia API”之类的术语,或者通过比较ServiceStack之类的产品,在网络上找到有关网络上服务层API的大量材料,该术语提倡较少的数据为导向的API。

如果您仍然不确定项目的性质, 原型.

  • 如果您最终获得了一堆与Web API的基本相同的控制器,则每个控制器恰好映射到一个实体,则您的API非常面向数据。 使用WCF数据服务.
  • 如果您最终获得了带有WCF数据服务的许多ODATA操作和尴尬的实体,那么您需要在API的服务器端上更多的域逻辑,并且数据取向不足以为您提供足够的服务。 使用Web API. 。一个好的经验法则是像对待SQL DBMS中的存储程序一样对待ODATA动作。实际上,将任何ODATA服务器都视为DBM,因为这就是它们。 如果您不将其放在SQL接口后面,请不要将其放在ODATA接口后面。

重要(更新)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top