不寒而栗。那不是 API - 它是一个漏洞。SOA 的部分要点是隔离不同的部分——允许对数据库进行细微更改而不会影响服务调用者。在这里,调用者提供原始 SQL。这意味着他们需要数据库的乱伦知识。所以它违反了封装。但是,还有其他严重的问题:
最重要的:
- 一旦你有了服务,你就不信任调用者了。这可能是您的应用程序,但也可能是某人只是查看了该应用程序,看到了它所连接的内容,并且正在从他们自己的代码中使用您的服务。你不能相信任何进入服务应用程序的东西。当然不是 SQL。与您(可能)不会将原始 SQL 作为隐藏输入放在 HTML 页面上的方式相同,然后您在 Web 应用程序中执行:再次,因为您不信任调用者。
还:
- 安全性:调用者可以/不能访问什么?他们可以发行
"delete from Orders"
吗?您无法清理呼叫者可以/不能做的事情
string[]
参数 - 并非所有值都作为字符串明确;这表明不了解数据模型 - 只是“东西”
- 返回- 好吧,无论如何
object
这不是数据合同,因此在大多数 WCF 绑定下都不起作用 - 尽管如果感觉很慷慨可能会原谅你NetDataContractSerializer
但是,这又不是API。API 将在众所周知的受控服务下公开带有类型参数的谨慎数据。有十几种方法可以设置一个像样的 API——从单个方法(在“受控”端)到 OData(在“开放”端)之类的东西——但这些方法都不会传递 SQL。
如果我不得不猜测:这个开发人员正在编写一个具有直接 SQL 访问权限的富客户端应用程序,并被告知通过服务公开数据。他们没有实际编写服务,而是简单地在 WCF 层公开了现有的 SQL 代码。那是倒退。他们现有的 SQL 代码(谨慎的 SQL 操作GetCustomer
等)应该已经成为WCF 层。调用客户端应该忘记它知道的所有 SQL,而是绑定到 WCF 服务。