C# BLL返回字符串或DTO

C# BLL返回字符串或DTO,c#,oop,design-patterns,exception-handling,C#,Oop,Design Patterns,Exception Handling,我不知道如何从业务层返回结果。有时,如果消息不符合条件,我需要返回消息。例如: public SalesDTO GetSalesByPrescriptionNo(string prescriptionNo) { int count = unitOfWork.SalesRepository.GetNumberOfPrescriptionUsed(prescriptionNo); if (count > 5) // I cannot return string/

我不知道如何从业务层返回结果。有时,如果消息不符合条件,我需要返回消息。例如:

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


感谢advanced。

当方法无法提供预期结果时,这是一种例外情况

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

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

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

这不是一个错误,为什么它应该被视为一个例外?这是一种很好的面向对象方法

这是个例外。GetSalesByPrescriptionNo方法表示它将交付销售。合同的名称中没有任何东西表明它在某些情况下可能无法退货。因此,调用方期望该方法成功

将该方法命名为tryGetSalesByReciptionNo或引发异常

如果选择异常路径,通常会在某个地方有另一个方法,可以检查是否可以调用该处方上的其他方法。i、 你的柜台支票

您可以执行以下操作:

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
因为在这种情况下这是一个例外。i、 e.如果您使用IsPrescriptionActive,您将隐藏一个错误,因为有效订阅在路上的某个地方变得无效

总结

处方应在UI中验证并直接报告给用户。 如果在业务层中发现无效的处方,则抛出异常。
当方法无法提供预期结果时,这是一种例外情况

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

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

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

这不是一个错误,为什么它应该被视为一个例外?这是一种很好的面向对象方法

这是个例外。GetSalesByPrescriptionNo方法表示它将交付销售。合同的名称中没有任何东西表明它在某些情况下可能无法退货。因此,调用方期望该方法成功

将该方法命名为tryGetSalesByReciptionNo或引发异常

如果选择异常路径,通常会在某个地方有另一个方法,可以检查是否可以调用该处方上的其他方法。i、 你的柜台支票

您可以执行以下操作:

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
因为在这种情况下这是一个例外。i、 e.如果您使用IsPrescriptionActive,您将隐藏一个错误,因为有效订阅在路上的某个地方变得无效

总结

处方应在UI中验证并直接报告给用户。 如果在业务层中发现无效的处方,则抛出异常。
@IlyaChumakov这不是一个错误,为什么它应该被视为一个例外?这是一个很好的面向对象方法?@IlyaChumakov这不是一个错误,为什么它应该被视为一个例外?这是一个很好的面向对象的方法?我明白了,我同意代码变得更加混乱,然后感谢您的精彩解释。我不明白,你通常在某处有另一种方法,你能举个例子吗?我明白了,我同意代码变得更加混乱,谢谢你的解释。我不明白你通常有其他的方法你能举个例子吗?