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 的多重结果?
当
该方法无法提供预期结果时,这是一种特殊情况。
调用方要么没有验证调用方法时使用的信息,要么试图获取根本不存在的东西。
如果使用返回值来指示这一点,则始终必须为每个方法调用处理两个不同的执行路径。然后代码变得更加混乱。
另一方面,异常将自动返回所有方法调用,直到出现 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
则隐藏了一个错误(因为有效的订阅在路上的某个地方无效)。
总结
- 应在 UI 中验证处方,并直接向用户报告。
- 如果在业务层中发现无效的处方,请引发异常。