BLL 返回字符串或 DTO

本文关键字:DTO 字符串 返回 BLL | 更新日期: 2023-09-27 18:36:29

我很困惑如何从业务层返回结果。有时,如果消息未通过条件,我需要返回消息。例如:

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

BLL 返回字符串或 DTO

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

调用

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

如果使用返回值来指示这一点,则始终必须为每个方法调用处理两个不同的执行路径。然后代码变得更加混乱。

另一方面,异常将自动返回所有方法调用,直到出现 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. 如果在业务层中发现无效的处方,请引发异常。