2016-02-26 21 views
1

我很困惑如何從業務層返回結果。有時我需要返回郵件,如果它不通過標準。例如:BLL返回字符串或DTO

public SalesDTO GetSalesByPrescriptionNo(string prescriptionNo) 
{ 
    int count = unitOfWork.SalesRepository.GetNumberOfPrescriptionUsed(prescriptionNo); 
    if (count > 5) 
     // I cannot return string/error information 
     // since the function is return SalesDTO type 
     return "Cannot used anymore"; 

    var sales = unitOfWork.SalesRepository.GetSalesByPrescriptionNo(prescriptionNo); 
    var salesDTO = Mapper.MapToDTO(sales); 
    return salesDTO; 
} 

基於良好的OOP/OOD實現,我應該如何處理BLL的多重結果?

在先進的感謝。

+2

拋出異常。 –

+0

@IlyaChumakov這不是一個錯誤,爲什麼它應該被視爲例外?這是一個很好的方法? – Willy

回答

4

當方法無法達到預期結果時,這是一種特殊情況。

調用者要麼在調用方法時未驗證使用的信息,要麼試圖獲取根本不存在的信息。

如果您使用返回值來指示,那麼您將始終必須爲每個方法調用處理兩個不同的執行路徑。代碼變得更加混亂。

另一方面,異常會自動返回所有方法調用,直到遇到try/catch語句爲止。因此,除非你真的可以處理異常,否則不需要檢查異常。

這不是一個錯誤,爲什麼它應該被視爲異常?這是一個很好的方法?

例外。方法GetSalesByPrescriptionNo表示它將交付銷售。合同名稱中沒有任何內容表明它在某些情況下可能無法退貨。因此,呼叫者期望該方法成功。

要麼命名方法TryGetSalesByPrescriptionNo要麼拋出異常。

如果您選擇異常路徑,您通常會找到另一個方法來檢查是否可以在該處方上調用其他方法。 (即你的查櫃)

你可以這樣做:

if (IsPrescriptionActive(prescriptionNo)) 
{ 
    var sales = GetSalesByPrescriptionNo(prescriptionNo); 
    //do something with sales 
} 

恕我直言,我喜歡比:

if (!TryGetSalesByPrescriptionNo(prescriptionNo, out sales)) 
{ 
    //do something with sales 
} 

,因爲你無法通過查看呼叫明白爲什麼方法失敗。你可以用第一個選擇。

但是,如果您希望用戶輸入有效的處方號碼(仍處於活動狀態),則沒有理由使用額外的支票。簡單地使用:

var sales = GetSalesByPrescriptionNo(prescriptionNo); 
//do something with sales 

因爲在這種情況下它確實是一個特例。即如果您使用IsPrescriptionActive您正在隱藏一個錯誤(因爲有效訂閱在道路上某處無效)。

摘要

  1. 處方應在UI進行驗證,並直接報告給用戶。
  2. 如果在業務層中發現無效處方,則拋出異常。
+0

我明白了,我同意「代碼變得更加混亂,然後」謝謝你的好解釋。我不明白「你通常有另一種方法」,你能舉一個例子嗎? – Willy

+0

@Willy:我已經更新了答案。 – jgauffin