我正在使用n層方法將大型經典ASP Web應用程序轉換爲ASP.Net MVC。在我的DAL中,我使用ADO.Net來查詢數據庫並將查詢轉換爲對象。我也有BLL來處理計算和驗證等事情。數據訪問層中的計算
我的問題涉及在需要計算以便將查詢轉換爲對象時,在DAL中執行計算。舉個例子,考慮與彙總信息的發票系統以及行項目:
public class Invoice
{
public int InvoiceID { get; set; }
public DateTime InvoiceDate { get; set; }
public decimal InvoiceTotal { get; set; }
public List<InvoiceLineItem> LineItemList { get; set; }
}
所以我的代碼在數據庫中查詢到改造線項目是這樣的:
因此,這裏的我的問題:考慮到我的n層體系結構,我的DAL是執行InvoiceTotal計算的正確位置嗎?考慮到BBL的部分工作是執行計算,這是否違反了DAL和BLL之間的關注點分離?或者,我是否正在從BBL的函數中逐字地執行計算,如果需要這些計算來填充模型,那麼可以在DAL中進行計算?我發現它在DAL中執行InvoiceTotal計算的一個原因是因爲我只需對發票項目記錄迭代一次。如果我在別處創建了一個單獨的InvoiceTotal函數來獲取InvoiceTotal,那麼我將不得不第二次迭代記錄。
編輯:事實證明,真正的問題不在於在DAL中是否允許計算,而是InvoiceTotal是否應該在我的模型中。從數據庫規範化的角度來看,它不是必需的,因爲可以根據行項目計算總計。在這種情況下,InvoiceTotal不應該在我的模型中,而應該在我的ViewModel中,在這種情況下,不需要在我的DAL中進行計算。由於性能原因,我可以忽略數據庫規範化問題,並在我的模型中包含InvoiceTotal,但是如果是這種情況,我會將InvoiceTotal持久化到數據庫,在這種情況下填充我的模型時不需要計算,因爲我只需從數據庫。
經驗教訓:如果我很想在我的DAL中進行計算,我的模型可能有缺陷。
一個平均CPU可能會每秒執行數百萬次迭代。這不應該決定你的架構;計算屬於業務層。 – CodeCaster
計算屬於業務層。持久和查詢數據屬於數據層。 – MUG4N
CodeCaster,我也試圖幹。如果我創建一個單獨的函數來計算髮票總額並重新遍歷記錄,我是否違反DRY? –