最近我考虑将面向服务的架构与一个优秀的用户界面结合起来时感到有些震惊,该用户界面利用SQL来优化查询数据时的性能。
例如,ASP.NET的DevExpress网格视图非常酷,它将所有过滤,排序和分页逻辑委托给数据库服务器。但是这假设数据是从SQL数据库服务器中检索的。
如果我想在数据库和UI层之间引入Web服务层,并让UI使用Web服务来查询数据,该怎么办?
List QueryData(string sqlQuery)
样式的Web服务,并且必须自己解析SQL字符串以保证安全/访问限制?这一定是一个非常普遍的问题,我相信它已经相对充分地解决了,是吗?
我主要对基于.NET / C#或兼容的解决方案感兴趣。
编辑:我找到了OData和Microsoft WCF数据服务。如果我做对了,基于OData的应用程序可能如下所示:
如果我做对了,我的DevExpress服务器控件应该能够通过所有这些层委托过滤请求(例如,仅给我前10名)到数据库然后应用其索引等以执行该操作查询。
是吗?
编辑:很高兴看到这个帖子变得生动:-)很难确定接受什么答案,因为对我来说似乎都很好......
答案 0 :(得分:2)
非常有趣的问题!我认为没有正确或错误的答案,但我认为你可以建立一些建筑原则。
首先,“面向服务的体系结构”是一种体系结构样式,要求您公开业务服务以供其他应用程序使用。运行数据库查询不是服务 - 至少在我看来。实际上,提供一个执行任意SQL的Web服务可能是一种反模式 - 您可以绕过大多数数据库服务器提供的安全模型,您无法控制查询 - 编写语法正确的“选择”相对容易查询瘫痪你的数据库(笛卡尔联接是我最喜欢的),并且Web服务协议的开销会使这种方法比通过正常访问路径查询数据库慢几倍 - LINQ或其他。
那么,让我们假设你接受这个观点 - 这个问题的解决方案是什么?
首先,如果您想要使用DevExpress网格的工作效率,您可能应该按照DevExpress希望您的工作方式工作 - 如果这意味着直接查询数据库,这是迄今为止最好的方法。如果您想迁移到SOA,并且DevExpress网格不支持它,那么就该找到一个新的网格控件,而不是将整个企业架构定制为一个相对较小的组件。
其次 - 在结构上,你应该在哪里进行排序,过滤等?这在SQL中是一个简单的概念,但在尝试将其转换为Web服务规范时却相当不愉快 - 您很快就会得到一个难以理解的方法签名(“getAccountDataForUser(userID,bool sortByDate,bool sortByValue,bool filterZeros,bool filterTransfers)” )。 另一方面,在客户端上执行过滤和排序是混乱和缓慢的。
我的建议是查看Specification Pattern - 这允许您拥有干净的方法签名,但以一致的方式指定所需的排序和排序。
答案 1 :(得分:1)
实施List QueryData(string sqlQuery)
会让您面临无数的安全问题。
如果您需要根据安全访问进行过滤,那么OData实现也不会很简单,您需要在WCF服务上设置适当的授权/身份验证,以便您可以根据经过身份验证的用户数据进一步过滤OData查询
从WCF服务检索数据时实现服务器端数据操作的最简单方法是拦截后面代码中Grid的排序/过滤操作,然后根据WCF服务调用WCF服务上的专用方法。用户正在做。
答案 2 :(得分:1)
“这一定是一个非常普遍的问题,我确信它已经存在 已经相对充分地解决了,有吗?“
考虑到开发者世界周围的皮肤猫的数量,我不得不说。
WCF数据服务提供了迄今为止我发现的最佳解决方案,但身份验证和授权可能会非常棘手。在http://blogs.msdn.com/b/astoriateam/archive/2010/07/19/odata-and-authentication-part-4-server-side-hooks.aspx,有一个很好的帖子涵盖了服务器端问题。设置它并不容易,但确实很有效。