2014-02-07 64 views
2

我目前有一种方法来保存用户。保存方法和结果

public PersonDto Save(PersonDto personDto) 

但是,如果在保存,我发现有一个重复的用户名,或其他一些问题与数据 - 我来回应这个唯一的办法就是抛出异常。

throw new Exception("Username exists"); 

我已经读过,不应该将异常用于'业务需求违规'。

有没有更好的方法将结果返回给我的调用方法?我需要返回到PersonDto,但也有一些关于任何问题的信息。这样做有没有普遍的做法或模式?也许会返回一个'SaveResult'对象,其中包含一个Object SavedObject(在本例中为我的PersonDto)以及其他一些属性,如string SaveResultbool Success

+0

我建议您在代码中发生类似问题时记录到文件,而不是抛出异常。我的大部分程序都有日志文件。 –

+1

指南(http://msdn.microsoft.com/zh-cn/library/ms229030.aspx)明确指出:DO通过抛出异常报告执行失败,并且不返回错误代码。如果Save方法无法保存,那就是执行失败。 –

+1

是否返回与传入的相同的PersonDto实例?如果是这样,那有什么意义?来电者已经提到它,对吗? –

回答

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,那么你也可以使用特定的方法返回类型。

+0

谢谢杰森 - 这是我在等待答复时所尝试的完全重复。除了为了使'SaveResult'通用,我采用'Object'而不是'PersonDto',以便它可以用于所有对象。 – Craig

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) 

这样你可以指定每个返回值的一些元数据。