最近,当我考虑将面向服务的架构与出色的 UI 相结合时,我感到有点震惊,该 UI 在查询数据时利用 SQL 来优化性能。
例如,ASP.NET 的 DevExpress GridView 非常酷,它将所有过滤、排序和分页逻辑委托(delegate)给数据库服务器。但这假定数据是是从支持 SQL 的数据库服务器中检索的。
如果我想在数据库层和UI层之间引入一个web服务层,让UI使用web服务查询数据呢?
- 如何设计 Web 服务和 UI,以便我可以通过 Web 服务将来自 UI 的过滤请求传递到数据库?
- 我是否需要提供
List QueryData(string sqlQuery)
样式的 Web 服务并且必须自己解析 SQL 字符串以保证安全/访问限制? - 或者是否有任何好的框架或设计指南可以减轻我的负担?
这一定是一个很普遍的问题,相信已经解决得比较充分了吧?
我主要对基于 .NET/C# 或兼容的解决方案感兴趣。
编辑:我找到了 OData 和 Microsoft WCF 数据服务。如果我做对了,基于 OData 的应用程序可能如下所示:
- User ---/Give me Page 1 (records 1..10)/---> ASP.NET Server Control(当然,通过 HTTP)
- ASP.NET 服务器控件 ---/LINQ 查询/---> 数据服务客户端
- 数据服务客户端 ---/OData查询/---> WCF数据服务
- WCF 数据服务 ---/LINQ 查询/---> Entity Framework
- Entity Framework ---/SQL查询/---> 数据库
如果我做对了,我的 DevExpress 服务器控件应该能够通过所有这些层将过滤请求(例如只给我前 10 个)委托(delegate)给数据库,然后应用其索引等以执行该操作查询。
是这样吗?
编辑: 很高兴看到这个线程活跃起来 :-) 很难决定接受什么答案,因为对我来说所有答案都一样好...
最佳答案
非常有趣的问题!我认为没有正确或错误的答案,但我认为您可以建立一些架构原则。
首先,“面向服务的架构”是一种架构风格,需要您公开业务服务以供其他应用程序使用。运行数据库查询不是一项服务——至少在我看来是这样。事实上,提供 Web 服务来执行任意 SQL 可能是一种反模式——你会绕过大多数数据库服务器提供的安全模型,你无法控制查询——编写语法正确的“select”相对容易使您的数据库瘫痪的查询(笛卡尔连接是我的最爱),并且 Web 服务协议(protocol)的开销会使这种方法比仅通过正常访问路由(LINQ 或其他)查询数据库慢几倍。
那么,假设您接受该观点 - 问题的解决方案是什么?
首先,如果您想提高使用 DevExpress 网格的效率,您可能应该按照 DevExpress 希望您工作的方式工作——如果这意味着直接查询数据库,那是迄今为止最好的方式。如果您想转向 SOA,而 DevExpress 网格不支持它,那么是时候寻找新的网格控件了,而不是将整个企业架构裁剪成一个相对较小的组件。
其次 - 在结构上,您应该在哪里进行排序、过滤等?这在 SQL 中是一个简单的概念,但在尝试将其转换为 Web 服务规范时却令人不快——您很快就会得到一个难以理解的方法签名(“getAccountDataForUser(userID, bool sortByDate, bool sortByValue, bool filterZeros, bool filterTransfers)” ). 另一方面,在客户端执行过滤和排序是困惑和缓慢的。
我的建议是查看 Specification Pattern - 这允许您拥有干净的方法签名,但以一致的方式指定所需的排序和排序。
关于c# - 使用 SQL 查询 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5468910/