我目前有一种保存用户的方法。
public PersonDto Save(PersonDto personDto)
但是,如果在保存时,我发现存在重复的用户名或数据的其他问题 - 我唯一的回应方式是抛出异常。
throw new Exception("Username exists");
我已经读过,“业务需求违规行为”不应使用例外情况。
有没有更好的方法将结果返回给我的调用方法?我需要返回PersonDto,还有一些关于任何问题的信息。这样做有共同的做法或模式吗?也许返回一个'SaveResult'对象,其中包含Object SavedObject
(在本例中为PersonDto),以及其他一些属性,如string SaveResult
和bool Success
?
答案 0 :(得分:2)
也许实现一个通用包装器用于所有这些请求。
enum Disposition
{
OK,
Warning,
Error
}
class Response<T>
{
public T Result { get; set; }
public Disposition Disposition { get; set; }
public string Message { get; set; }
}
即:
public Response<PersonDto> Save(PersonDto personDto)
这样,您可以为每个返回值指定一些元数据。
答案 1 :(得分:1)
我建议使用SaveResult
方法解决您的问题,例如
public class SaveResult
{
public PersonDto { get; set; }
public bool Success { get; set; }
public string ErrorMessage { get; set; }
}
var result = Save(person);
if (!result.Success)
{
Console.WriteLine(result.ErrorMessage);
}
或类似的东西。这将允许您传回PersonDto
,但也向API调用者发出信号,表示尝试保存时发生错误。
抛出异常并没有什么问题,但是当你还想要返回DTO的人时,你也可以为此目的使用特定的方法返回类型。