此问题中的OP询问使用WCF / OData作为内部数据访问层。
Arguments of using WCF/OData as access layer instead of EF/L2S/nHibernate directly
响亮的回复似乎是不要这样做。我与OP的位置相似,但在原始问题中没有提出任何问题。我正在尝试为许多不同的平台开发(本机),但希望尽可能多地保留数据和业务逻辑服务器端。所以我将拥有iOS / Android / Web(MVC)/桌面应用程序。目前,我有一个带有ORM数据访问层(LLBLGen Pro)的WinForms应用程序。
我正在设想将我的大部分业务/数据访问逻辑(可能仍然使用LLBLGen或其他ORM)移到WCF / OData接口之后。然后使不同平台上的所有不同客户端都非常薄(基本上是UI和WCF调用)。
这也是过度设计的吗?我错过了一个更简单的解决方案吗?
答案 0 :(得分:1)
我在您的架构中看不到任何问题,或者认为它过分严重,因为OData是标准协议,您的概念也符合DRY原则。
我改变了一个问题:为什么你会在每个客户端中实现相同的业务逻辑,以引入更多可能的错误,并且无法在单个集中位置修复错误。您的想法使您只能实施一次安全层。
OData是一个跨平台标准,您可以为每个开发平台找到一个OData库(MSDN,OData.org,JayData for JavaScript)。此外,您可以使用OData FunctionImports / Service方法和实体级方法,这将简化您的查询。
答案 1 :(得分:0)
如果您正在运行多平台开发,那么您可能会发现更实用的选择与平台无关的通信协议(如HTTP),而不是直接使用多个驱动程序和ORM来访问您的数据源。此外,由于OData是一种REST协议,因此客户端不需要太多:可以格式化OData HTTP请求和解析HTTP响应的任何内容。但是有几个方面需要注意:
OData服务器不是SQL数据库的替代品。它支持批处理但它们与数据库事务不同(尽管在许多情况下可用于建模事务操作)。它支持父子关系,但它不支持经典SQL意义上的JOIN。所以你必须计划你公开的OData实体。使用包装EF模型的WCF数据服务构建OData服务器太容易了。太容易了,因为人们经常暴露低级数据库内容而不是构建高级域类型。
至于今天,OData多平台客户仍处于开发阶段,但它们即将到来。如果我可以提出一些我个人正在研究的内容,请查看Simple.Data OData适配器(https://github.com/simplefx/Simple.OData,查看其Wiki页面的示例) - 它有一个NuGet包。虽然这是一个仅支持.NET 4.0的客户端库,但它的一部分被提取出来作为可移植类Library Simple.OData.Client发布,以支持.NET 4.x,Windows Store,Silverlight 5,Windows Phone 8,Android和iOS。事实上,如果你检查Git存储库的winrt分支,你会发现一个多平台PCL,它还没有在NuGet上发布。