2014-01-11 129 views
2

我正在使用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中進行計算,我的模型可能有缺陷。

+0

一個平均CPU可能會每秒執行數百萬次迭代。這不應該決定你的架構;計算屬於業務層。 – CodeCaster

+0

計算屬於業務層。持久和查詢數據屬於數據層。 – MUG4N

+0

CodeCaster,我也試圖幹。如果我創建一個單獨的函數來計算髮票總額並重新遍歷記錄,我是否違反DRY? –

回答

3

我將計算添加到業務邏輯層

發票總的初始計算應該是在應用程序中使用已將其寫入數據庫之前,所以你不希望的唯一的地方是,總計算是在檢索記錄時計算的。

將其添加到業務邏輯層的另一個好的理由是,它可以從DAL返回的行數據派生出來,這會保持DAL層專注於寫入和讀取數據。這也使您的計算在一個地方。

但是由於發票總數一旦發送就被固定,您可能需要在首次保存時寫入初始值,然後允許手動修改。在這種情況下,發票總計算將在業務層完成,但該值也將寫入數據庫並從數據庫中檢索,而不進行重新計算。

+0

實際上,我認爲我的錯誤是InvoiceTotal應該不在模型中,而只在ViewModel(例如InvoiceViewModel)中。從數據庫規範化的角度來看,沒有理由將發票總計保留到數據庫,因爲它可以根據行項目進行計算。如果我決定在我的模型中不包含InvoiceTotal,並且只在我的ViewModel中使用它,那麼很明顯InvoiceTotal必須是一個單獨的函數,因爲它不在InvoiceModel中。 –

+0

我同意一個淨髮票總額。總計算中將包含一些可能會在未來發生變化的稅收因素。在這種情況下,我一定會將它寫入數據庫。 –

+0

你明白了,因爲你的回答讓我看到我的模型有缺陷 –