关于这样的数据库工作你能说些什么?

时间:2013-05-29 11:27:20

标签: c# .net wcf design-patterns refactoring

我正在审查他的WCF服务中的一些人的代码:

[ServiceContract]
public interface IDBService
{
    [OperationContract]
    void DBUpdateInsert(string sql, params string[] parameters);

    [OperationContract]
    object DBSelect(string sql, params string[] parameters);
}

每个需要调用SQL代码的函数都使用此服务。

这样的利弊是什么?对我来说似乎很不确定。

1 个答案:

答案 0 :(得分:8)

发抖。这不是一个API - 它是一个漏洞。 SOA的一部分重点是隔离不同的部分 - 允许对数据库进行微小更改,以免影响服务调用者。在这里,调用者提供原始SQL。这意味着他们需要对数据库的乱伦了解。所以它违反了封装。但是,还有其他严重问题:

最重要的是:

  • 一旦您有服务,不信任来电者。这可能是您的应用程序,但可能是有人只是查看应用程序,查看它连接的内容,并使用他们自己的代码中的服务。您不能信任进入服务应用程序的任何。当然不是SQL。与您(可能)不会将原始SQL作为隐藏输入放在HTML页面上然后在Web应用程序中执行的方式相同:再次,因为您不信任调用者

此外:

  • 安全性:来电者可以/不可以访问什么?他们可以发出"delete from Orders"吗?你有没有能够消毒调用者可以做什么/不能做什么
  • string[]参数 - 并非所有值都是明确的字符串;这表明对数据模型没有任何理解 - 只是“东西”
  • 返回object - 好吧,这不是数据合约无论如何,所以在大多数WCF绑定下都行不通 - 尽管NetDataContractSerializer可能会原谅你感觉很慷慨

但是,再次,这是 API。 API将使用类型化参数在众所周知的受控服务下公开谨慎的数据。有十二种方法可以设置一个不错的API - 从个别方法(在“受控”端)到OData(在“开放”端)之类的东西 - 但是 none 将传递SQL。

如果我不得不猜测:这位开发人员正在编写一个具有直接SQL访问权限的富客户端应用程序,并被告知要通过服务公开数据。他们只是在WCF层公开了现有的SQL代码,而不是实际编写服务。那是倒退。他们现有的SQL代码(谨慎的SQL操作,如GetCustomer等)应该成为 WCF层。调用客户端应该忘记它知道的任何SQL,并绑定到WCF服务。