Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存方法和结果_C#_Oop - Fatal编程技术网

C# 保存方法和结果

C# 保存方法和结果,c#,oop,C#,Oop,我目前有一个保存用户的方法 public PersonDto Save(PersonDto personDto) 然而,如果在保存时,我发现存在重复的用户名,或者数据存在其他问题,那么我唯一的响应方法就是抛出异常 throw new Exception("Username exists"); 我已经读到,异常不应该用于“业务需求违规” 有没有更好的方法将结果返回给我的调用方法?我需要回到PersonDto,但也需要一些关于任何问题的信息。有没有一个共同的做法或模式来做到这一点?可能会返回一个

我目前有一个保存用户的方法

public PersonDto Save(PersonDto personDto)
然而,如果在保存时,我发现存在重复的用户名,或者数据存在其他问题,那么我唯一的响应方法就是抛出异常

throw new Exception("Username exists");
我已经读到,异常不应该用于“业务需求违规”


有没有更好的方法将结果返回给我的调用方法?我需要回到PersonDto,但也需要一些关于任何问题的信息。有没有一个共同的做法或模式来做到这一点?可能会返回一个“SaveResult”对象,其中包含一个
对象SavedObject
(在本例中为my Persondo),以及一些其他属性,如
字符串SaveResult
bool Success

我建议使用
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调用方发出信号,表明在尝试保存时发生了错误


抛出异常并没有什么真正的错误,但由于您也希望返回person DTO,因此您最好使用特定的方法返回类型来实现该目的。

可能实现一个通用包装器,用于所有此类请求

enum Disposition
{
    OK,
    Warning,
    Error
}

class Response<T>
{
    public T Result { get; set; }
    public Disposition Disposition { get; set; } 
    public string Message { get; set; }
}
enum配置
{
好啊
警告
错误
}
班级反应
{
公共T结果{get;set;}
公共处置处置{get;set;}
公共字符串消息{get;set;}
}
i、 e:

公共响应保存(PersonDto PersonDto)

通过这种方式,您可以为每个返回值指定一些元数据。

我建议在代码中出现类似问题时登录到文件,而不是抛出异常。我的大多数程序都有日志文件。指南()明确规定:通过抛出异常报告执行失败,并且不返回错误代码。如果Save方法无法保存,则表示执行失败。返回的PersonDto实例是否与传入的实例相同?如果是的话,重点是什么?调用者已经有了对它的引用,对吗?克里斯-这个人得到了一些添加到它的信息。如果是新人,保存前不会设置PersonId。然后设置它,并返回到PersonDto.PersonId中调用的。在更新时,它可能是同一个对象。谢谢Jason-这与我在等待回复时尝试的完全相同。除此之外,为了使“SaveResult”通用,我使用了“Object”,而不是“PersonDto”,以便它可以用于所有对象。
public Response<PersonDto> Save(PersonDto personDto)