我正在审查他的WCF服务中的一些人的代码:
[ServiceContract]
public interface IDBService
{
[OperationContract]
void DBUpdateInsert(string sql, params string[] parameters);
[OperationContract]
object DBSelect(string sql, params string[] parameters);
}
每个需要调用SQL代码的函数都使用此服务。
这样的利弊是什么?对我来说似乎很不确定。
答案 0 :(得分:8)
发抖。这不是一个API - 它是一个漏洞。 SOA的一部分重点是隔离不同的部分 - 允许对数据库进行微小更改,以免影响服务调用者。在这里,调用者提供原始SQL。这意味着他们需要对数据库的乱伦了解。所以它违反了封装。但是,还有其他严重问题:
最重要的是:
此外:
"delete from Orders"
吗?你有没有能够消毒调用者可以做什么/不能做什么string[]
参数 - 并非所有值都是明确的字符串;这表明对数据模型没有任何理解 - 只是“东西”object
- 好吧,这不是数据合约无论如何,所以在大多数WCF绑定下都行不通 - 尽管NetDataContractSerializer
可能会原谅你感觉很慷慨但是,再次,这是不 API。 API将使用类型化参数在众所周知的受控服务下公开谨慎的数据。有十二种方法可以设置一个不错的API - 从个别方法(在“受控”端)到OData(在“开放”端)之类的东西 - 但是 none 将传递SQL。
如果我不得不猜测:这位开发人员正在编写一个具有直接SQL访问权限的富客户端应用程序,并被告知要通过服务公开数据。他们只是在WCF层公开了现有的SQL代码,而不是实际编写服务。那是倒退。他们现有的SQL代码(谨慎的SQL操作,如GetCustomer
等)应该成为 WCF层。调用客户端应该忘记它知道的任何SQL,并绑定到WCF服务。