2009-04-22 78 views
2

我有一個CRUD沉重的ASP.NET應用程序,其中包含存儲過程中的所有業務邏輯。將數據移出數據庫時將業務邏輯移動到何處

作爲一個例子,有一個UPDATE存儲過程約500行,幷包含大量的條件邏輯,引用了多個表UDFs & UDF。 proc需要更新字段名稱和新值,設置一堆聲明的變量,執行一堆驗證並創建動態SQL語句來執行更新。一旦適合所有人。這很大,很混亂。

我想將業務邏輯轉移到.NET端,以便更容易管理/更新,測試並置於源代碼控制之下。

我的問題是這樣的:這個商業邏輯應該去哪裏?

假設我有一個名爲'Factory'的屬性的PurchaseOrder對象。如果工廠被更改,我需要確保分配的新工廠生產PurchaseOrder上的產品,具有定價並且基於該工廠要求最低數量等。所有這些驗證都需要在數據庫。

我應該有PurchaseOrder對象的Factory setter負責通過一個'isFactoryValid'方法/屬性來進行數據驗證,該方法/屬性可以對通用數據訪問對象進行多重調用,然後進行更新?

我還是創建一個PurchaseOrder /數據庫'代理'對象,負責處理與PurchaseOrder相關的數據訪問。在這種情況下,我是否會在代理中有一個'isFactoryValid'方法,由PurchaseOrder的setter調用,然後調用代理的更新方法?

如何確定是否需要擔心增加所有這些額外呼叫的數據庫流量?

回答

1

有跡象表明,被廣泛用於實現持久性的邏輯出了DB的兩個主要模式:

的技巧與這兩個對象是知道什麼時候跑一趟到數據庫,知道什麼時候不。例如,是將在數據庫和域層之間完成的冗餘驗證,例如,甚至在進行數據庫調用之前,您應該評估非空值,將字符串截短爲長度等。只有在這些檢查之後已經作出應該打電話給保存在數據庫中。

還有一系列可用於提高性能或最小化數據庫訪問的策略,如延遲加載,事務處理等。

2

一種方式做到這一點: 你必須與該層的界面在.NET數據層(一個或多個數據類)...然後你有使用執行業務邏輯的業務層接口。 http://en.wikipedia.org/wiki/Multitier_architecture

+0

但是請注意:將業務邏輯移出數據庫可能會導致數據庫調用(「chattiness」)增加 – RobS 2009-04-22 00:59:21

0

您還可以將您的業務邏輯轉換爲可重複使用的Web服務塊。 WCF提供了很好的工具支持。

0

這將取決於你所創建的對象模型和你是如何讓來電者決定哪些工廠將成爲新工廠來處理PurchaseOrder的。例如,如果您爲呼叫者提供他們可以從中挑選的工廠列表,則可以將列表篩選爲僅支持與現有PurchaseOrder相關聯的產品的列表(我假設您已編輯現有訂單)。如果你想讓PurchaseOrder驗證Factory可以處理訂單,我會讓PurchaseOrder上的setter調用Factory上的一個方法(類似CanProcessOrderFor(product,quantity))。

我假設你將不得不做一個數據庫查詢已獲得工廠和PurchaseOrder列表。我希望Factory對象的查詢返回它們支持的產品和當前數量的列表(或最小訂單 - 無論您的邏輯需要如何)。

如果這是一種常見的情況,像NHibernate這樣的好的ORM會讓你緩存一些結果以最小化往返。

相關問題