c# - 您对这种数据库工作有何看法?

标签 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 代码的函数都使用此服务。

这种方式有什么优缺点?这对我来说似乎很不确定。

最佳答案

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

最重要的:

  • 一旦获得服务,您就不信任来电者。那可能是您的应用程序,但也可能是某人刚刚查看了该应用程序,看到了它所连接的内容,并正在通过他们自己的代码 使用您的服务。您不能信任进入服务应用程序的任何。当然不是SQL。这与您(大概)不会将原始 SQL 作为隐藏输入放在 HTML 页面上然后在 Web 应用程序中执行的方式相同:同样,因为您不信任调用者

还有:

  • 安全性:调用者可以/不能访问什么?他们可以发出 "delete from Orders" 吗?你没有能力来清理调用者能做什么/不能做什么
  • string[] 参数 - 并非所有值都是明确的字符串;这表明不了解数据模型 - 只是“东西”
  • 返回 object - 好吧,这不是数据协定无论如何,所以在大多数 WCF 绑定(bind)下都不起作用 - 虽然 NetDataContractSerializer 如果感觉慷慨,可能会原谅你

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

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

关于c# - 您对这种数据库工作有何看法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16812647/

相关文章:

c# - C# 中的元组定义

c# - Telerik 网格工具栏插入 - 显示自定义文本

.net - C#Decimal.GetHashCode()和Double.GetHashCode()等于

.net - 在 Razor 网页的 View 中调用方法

wcf - DataContractSerializer 每个请求多次序列化同一个对象

c# - 关闭连接时 WindowsRT StreamSocket 异常

c# - 如何使用 PrintServer 类和 PrintQueue 类控制 PrintServer 上的所有打印作业

c# - WCF 4 关闭客户端代理

javascript - 使用 Javascript 连接到 WCF Web 服务

c# - 将 PDFBytes 节点内容转换为 PDF 文件 Docusign