OData 与 ServiceStack? [关闭]

2024-01-01

我刚看到服务栈 http://servicestack.net我正在考虑用它建立一个服务。

是否可以通过服务堆栈提供 OData 提要,以便我能够公开 IQueryable 并从客户端查询它?


Edit

ServiceStack现已添加自动查询 http://docs.servicestack.net/autoquery这是我们实现数据驱动服务的方法,可以避免OData 提出的陷阱和反模式 http://docs.servicestack.net/why-not-odata.


ServiceStack是否支持OData?

No.

反正也不直接。如果有人看到 OData 的任何价值,他们可以自由添加必要的功能作为可选功能Plugin http://docs.servicestack.net/plugins- 但它永远不会内置到 ServiceStack 核心中。

不良的开发实践

OData 不太适合 ServiceStack强烈反对过度抽象 http://www.infoq.com/articles/interview-servicestack以及我们认为的“神奇行为”的经典例子 https://twitter.com/coates/status/268767167686787072:

当您的精美框架发挥神奇作用时,您节省的每一分钟 帮助您节省未来十分钟的调试成本。不值得。

我们认为依赖黑盒斑点的神奇行为永远不会经受住时间的考验。历史上每当我们使用这个(例如ADO.NET 数据集 http://msdn.microsoft.com/en-us/library/8bw9ksd6%28v=vs.71%29.aspx, ASP.NET 动态数据 http://msdn.microsoft.com/en-us/library/ee845452%28v=vs.100%29.aspx)我们很快就遇到了这些框架固有的不灵活的限制,这些框架无法发展以支持新的开发人员实践、范式和技术,而它们的设计初衷并不是支持这些,从而导致它们很快被弃用,取而代之的是更新的框架这样可以。这是我们不希望提倡的重写周期。

宣扬不良网络服务实践

OData 还促进了您所处的反模式暴露内部实现细节您的服务的隐式服务契约与底层 RDBMS 表紧密耦合,使您能够对未来服务的缓存性、重构或版本能力进行有限的控制。

这类似于传递数据库连接字符串,一旦生产中的客户端绑定到它,表的结构就会被冻结,从而抑制发展现有数据库表的能力,因为它可能会破坏现有客户端。 ServiceStack 的建议是将您的客户端绑定到定义良好的服务层,您可以自由地重构其实现。

总而言之,OData确实提供了丰富的功能,但我个人不建议在您无法控制且可以部署客户端和服务器的内部网之外使用它。

WebApi 是通过返回对 oData 隐式支持的最佳选择IQueryable<T>界面。

仅用于仅 Microsoft 技术

Web/远程服务(尤其是 SOA)的主要好处之一是,它为您希望公开的任何功能提供了一个与技术无关且可互操作的外观。虽然OData http://www.odata.org/是一个开放标准,该技术本身基本上仅被微软采用.NET 相关举措 http://www.odata.org/ecosystem.

OData 速度慢

OData 发现本身很慢 https://coldie.net/?tag=servicestack(这与我们的核心目标相悖)并且缺乏对实施的控制使得很难干净地实施诸如缓存之类的性能增强技术。

具体例子

我在评论的最后给出了一个具体的例子来说明为什么 oData 是一个坏主意IQueryable 是紧耦合 http://blog.ploeh.dk/2012/03/26/IQueryableTisTightCoupling/我将在此处重复该帖子以进行保存:

Web 服务接口的整体思想是公开一个 与外界技术无关的可互操作 API。

公开 IQueryable/OData 端点可以有效地耦合您的 无限期地使用 OData 的服务,因为您无法切实可行 确定现有客户端绑定到什么“查询空间”,即什么 您需要冻结/支持的现有查询/表/视图/属性 无限期地。在公开任何实施时,这是一个问题 API 的表面积,因为它限制了您添加自己的 API 的能力 其上的自定义逻辑,例如授权、缓存、监控、 速率限制等。并且因为 OData 非常慢,所以您会遇到 早期出现性能/扩展问题。缺乏控制 端点,意味着您实际上正在进行重写:https://coldie.net/?tag=servicestack https://coldie.net/?tag=servicestack

让我们看看摆脱 oData 提供商的可行性如何 通过查看来自 Netflix OData 的现有查询来实现 应用程序编程接口:

http://odata.netflix.com/Catalog/Titles http://odata.netflix.com/Catalog/Titles?$filter=类型%20eq%20'电影'%20and%20(Rating%20eq%20'G'%20or%20Rating%20eq%20'PG-13')

该服务现在有效地耦合到名为的表/视图 “标题”有一列名为“类型”的列。

如果您不使用 OData,它会如何自然地编写:

http://api.netflix.com/movies? ratings=G,PG-13 http://api.netflix.com/movies?ratings=G,PG-13

现在,如果出于某种原因您需要替换 现有的服务(例如更好的技术平台已经出现, 它运行太慢,您需要将此数据集移动到 NoSQL/Full-TextIndexing-backed sln)需要付出多少努力才能 替换 OData impl(它有效地绑定到 RDBMS 模式) 和 OData 二进制 impl)到更直观的与 impl 无关的查询 以下?这并非不可能,但因为它非常困难 为新技术实现 OData API,即重写 + 破坏 现有客户往往是首选。

让内部实现决定面向外部的 url 当事情需要时,结构是打破现有客户的可靠方法 改变。这就是为什么你应该在 Cool URI 后面公开你的服务, 即逻辑永久 URL(不受实施阻碍) 不会改变,因为您通常不想限制 您服务的技术选择。

如果您想提供临时的“探索性”,这可能是一个不错的选择 服务”,但这不是我想要的外部客户 绑定到生产系统中。如果我只想限制它 使用我的本地 Intranet 与仅仅提供相比有什么优势 输出只读连接字符串?这将允许其他人使用 他们最喜欢的 Sql Explorer、Reporting 或任何其他会说话的工具 SQL。

Update

Netflix 刚刚停用其 OData 目录,于 2013 年 4 月 8 日生效 http://developer.netflix.com/blog/read/Changes_to_the_Public_API_Program.

添加了新答案为什么我们建议使用干净、定义良好、未受污染的 DTO 来定义任何远程服务 https://stackoverflow.com/a/15369736/85785,这是使用 OData 无法推广的远程服务最佳实践。

关于原因的好文章OData 等基于通用的 API 比同等的基于意图的 API 更脆弱、更复杂且更难使用 http://mathieu.fenniak.net/stop-designing-fragile-web-apis/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OData 与 ServiceStack? [关闭] 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • 黑莓输入流到字符串的转换

    如何在 BlackBerry 上将 InputStream 转换为字符串 对于最少的代码来说怎么样 String str new String IOUtilities streamToBytes is UTF 8
  • Flutter 检测杀死应用程序

    我想知道是否可以检测杀死该应用程序 假设在聊天应用程序中 我能够使用 onWillPop 获取用户离开聊天室时的时间戳 但是 如果用户直接从聊天室终止该应用程序 则该应用程序不会被启动 那么有没有办法检测到呢 或者有什么建议以不同的方式获取
  • Grails 2.4 和 hibernate4 run-app 错误

    我已将应用程序升级到 Grails 2 4 0 并且正在使用 hibernate4 插件 执行 run app 时 使用内存数据库为每个域类生成以下错误示例 我在 hibernate 论坛上读过几篇文章 这些错误并不严重 它只是记录一个错误
  • 如果 f:viewParam 为空则重定向

    如果出现以下情况 我会执行重定向 或错误 f viewParam是空的
  • 在不同线程上使用 Application.Run()

    请看一下下面的代码 var splashForm new SplashForm m Thread new Thread gt System Windows Forms Application Run splashForm m Thread
  • 如何使用 MIT-Scheme 启动 slimv 的 REPL

    我的操作系统是 Debian Squeeze 这是 vim 版本 VIM Vi IMproved 7 2 2008年8月9日 2010年7月12日02 29 33编译 我读过一篇教程http kovisoft bitbucket org t
  • 防止 writeDataTable (openxlsx) 写入任何列名

    将表格写入 Excel 工作簿时 wb lt createWorkbook addWorksheet wb Data data lt tibble x seq 1 10 y c A B C D NA NA NA NA NA NA write
  • 今天的时间标签

    对于日期范围 我目前使用这种格式 直到出现精确的规范
  • struts2 Ajax错误?

    我的动作课上有 try tspNameIdMap slsReqMgmtCommonRemote getTspNameIdMap Integer parseInt circleId throw new ReqMgmtException Mes
  • 动态延迟 IObservable 值的延迟函数

    这个问题是关于IObservable Rx http blogs microsoft co il blogs bnaya archive 2010 02 19 rx reactive extension for beginner part
  • 比较 javascript 或 jquery 中两种不同的数组类型

    我有两种不同的数组类型 其中一个是字符串数组 另一个是对象数组 stringArray P1 P2 P3 objectArray P P1 PO 5 P P3 PO 10 我想将对象数组放入表中 字符串数组元素必须是表头 如果对象数组有P
  • 如何通过AJAX向Flask发送数据?

    我正在制作一个基于 Flask 的小型网络项目 我必须向 Flask 发送一些数据 但我不知道该怎么做 我尝试了不同的方法 尝试使用 JSON 但我不知道如何使用它 也许有人可以与我分享工作代码或通过解释我必须做什么来帮助我 new fre
  • 在 GitHub Actions .yaml 中为 R 包配置 codecov 令牌

    我正在尝试为公共 R 包设置 codecov 监控 其中 GitHub Actions 将运行covr codecov 我正在看这个 yaml 示例 Source https github com r lib actions blob c9
  • 无法使用 jQuery 从其他站点获取 HTML 页面($.get、$.ajax)[重复]

    这个问题在这里已经有答案了 可能的重复 使用 ajax query 将外部页面的内容加载到另一个页面 https stackoverflow com questions 4560183 load content from external
  • CSS:使用 :target 更改多个 ID 上的 css

    我正在尝试建立一个基于纯 HTML CSS 的网站 该网站使用 target 来指定要显示的内容 所以我有一个菜单 其中有 3 个选项卡 当目标等于 ID 时 选项卡会突出显示或其他内容 HTML table tr td class con
  • 容器化 Python 命令行应用程序

    我创建了一个 Python 命令行应用程序 可通过 PyPi pip install 该应用程序具有本机依赖性 为了减轻 Windows 用户的安装痛苦 我想从此命令行应用程序创建一个 Docker 化版本 转换的步骤是什么setup py
  • 定位“确定”/“取消”按钮,以便它们模仿对话框中的布局

    你们中的一些人可能已经注意到 Android 更改了 ICS 之后对话框中 确定 取消 按钮的显示顺序 请参阅这个问题 http code google com p android issues detail id 24138 这种改变可能
  • TCP客户端消息处理

    例如 我正在接收字节流 并且需要拆分消息 Message1 nMessage2 nMessage3 nMess 每条消息都将附加 n 字符 但是当完整的消息无法放入缓冲区时 它会获取消息的一部分 并在下一个消息中获取另一部分recv可能需要
  • DBeaver 不显示 dbms_output

    我正在使用 dbeaver 版本 5 1 3 当我对 oracle pl sql 使用 DBMS OUTPUT PUT LINE 方法时 它的输出不会在任何地方显示 它有一个输出选项卡 也是一片空白 您可以启用服务器输出控制台 Ctrl S
  • OData 与 ServiceStack? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚看到服务栈 http servicestack net我正在考虑用它建立一个服务 是否可以通过服务堆栈提供 OData 提要 以便我能