BLL返回字符串或DTO

时间:2016-02-26 18:52:02

标签: c# oop design-patterns exception-handling

我很困惑如何从业务层返回结果。有时我需要在没有通过标准的情况下返回消息。例如:

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的多重结果?

先谢谢。

1 个答案:

答案 0 :(得分:4)

当方法无法提供预期结果时,这是一种特殊情况。

调用者要么没有验证调用方法时使用的信息,要么尝试获取根本不存在的信息。

如果使用返回值来表示,则每个方法调用都必须处理两个不同的执行路径。代码变得更加混乱。

另一方面,异常将自动返回所有方法调用,直到它出现在try / catch语句中。因此,除非您真的能够处理异常,否则无需检查异常。

  

这不是错误,为什么它应被视为例外?这是一个很好的oop方法吗?

是一个例外。方法GetSalesByPrescriptionNo表示它将提供销售。名称和合同中没有任何内容表明它可能无法在某些情况下退回销售。因此调用者期望方法成功。

命名方法TryGetSalesByPrescriptionNo或抛出异常。

如果你选择了异常路径,你通常会在某处使用另一种方法来检查是否可以调用该处方上的其他方法。 (即你的柜台检查)

您可以执行以下操作:

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

imho我比那更好:

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

因为你无法通过查看调用该方法失败的原因来理解。你可以使用第一种选择。

但是,如果您希望用户输入了有效的处方号(仍处于活动状态),则没有理由使用额外的检查。只需使用:

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

因为在这种情况下它确实是一个特例。即如果您使用IsPrescriptionActive,则隐藏了一个错误(因为有效订阅在路上某处无效)。

<强>摘要

  1. 处方应在用户界面中验证并直接向用户报告。
  2. 如果在业务层中找到无效处方,则抛出异常。