2016-02-26 61 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