0

我正在阅读罗伯特·罗斯尼 (Robert Rossney) 的文章“你必须维护的最不健全的程序是什么?” 发现于:(您必须维护的最不健全的程序是什么?)当我意识到我无意中开发了一个几乎相同的应用程序时!
该应用程序包含一个 HTTPListener 对象,该对象抓取传入的 POST 请求。根据标头中的信息,我将请求正文传递给 SQL Server 以执行适当的事务。
请求如下所示:

<InvoiceCreate Control="389>
  <Invoice>
    <CustomerNumber>5555</CustomerNumber>
    <Total>300.00</Total>
    <RushOrder>1</RushOrder>
  </Invoice>
</InvoiceCreate>

HTTPListener 对象接收到它后,我通过存储过程使用 SQL Server 的内置 XML 处理功能对 Invoice 表执行所需的 INSERT:

  INSERT INTO Invoice (InvoiceNumber, CustomerNumber, Total, RushOrder)
  SELECT @NEW_INVOICE_NUMBER,  
         @XML.value('(InvoiceCreate/Invoice/CustomerNumber)[1]', 'varchar(10)'),
         @XML.value('(InvoiceCreate/Invoice/Total)[1]', 'varchar(10)'),
         @XML.value('(InvoiceCreate/Invoice/Total)[1]', 'varchar(10)')  

然后我在同一个存储过程中使用另一个 SELECT 语句来返回插入到 Invoices 表中的新 Invoice Number 的值:

SELECT @NEW_INVOICE_NUMBER FOR XML PATH 'InvoiceCreateAck'  

然后,我使用 C# 中的 SQL 数据读取器对象读取生成的 XML,并将其用作 HTTPListener 对象的响应。

我的问题是,我注意到罗伯特确实是正确的。我的所有应用程序逻辑都存在于存储过程中,因此我发现自己必须在存储过程中进行大量错误检查(即验证客户编号和发票编号值)。

我仍然是一名中级开发人员,因此,我正在寻求改进。鉴于原始帖子和我当前的架构,我可以做些什么不同的事情来改进应用程序?有没有我可以参考的模式或最佳实践?你会采取什么方法?我愿意接受任何和所有的批评,因为我想尽自己的一份力量来减少世界上“不健全的编程”的数量。

4

1 回答 1

0

不确定具体的模式,但你需要定义你的图层并坚持下去。我在这里非常松散地使用图层。您有一层需要解析 XML。您有一个读取 HTTP 请求的层。您有一层进行数据访问。如果您使用 C#,这些可能是 3 个单独的类。

我不会在存储过程中这样做。根据我的经验,如果您更改数据库,这样做几乎可以完全重写。测试也真的很难。

对于您的数据访问,您仍然可以使用您的存储过程。我个人只会使用 C# 编写简单的插入语句。我只是努力将任何业务逻辑排除在存储过程之外。保留任何业务逻辑,在 C# 中解析,因为以后移植会容易得多。

祝你好运!

于 2012-07-05T03:41:00.293 回答