2014-02-07 3 views
2

현재 사용자를 저장하는 방법이 있습니다. 이 응답 내 유일한 방법은 예외가 발생하는 것입니다 - 저장하는 동안방법 및 결과 저장

public PersonDto Save(PersonDto personDto) 

그러나, 경우에, 나는 중복 사용자 이름, 또는 데이터에 몇 가지 다른 문제가 찾을 수 있습니다.

throw new Exception("Username exists"); 

'비즈니스 요구 사항 위반'에 예외를 사용해서는 안된다는 내용을 읽었습니다.

내 호출 메서드에 결과를 반환하는 더 좋은 방법이 있습니까? PersonDto로 돌아 가야 할뿐만 아니라 어떤 문제에 대한 정보도 필요합니다. 이 작업을 수행하는 일반적인 방법이나 모델이 있습니까? 어쩌면 Object SavedObject (이 경우 PersonDto)과 string SaveResultbool Success과 같은 다른 속성을 포함하는 'SaveResult'객체를 반환 할 수 있습니까?

+0

예외를 throw하는 대신 코드에 이와 같은 문제가 발생할 때 파일에 로깅하는 것이 좋습니다. 내 프로그램의 대부분에 대한 로그 파일이 있습니다. –

+1

지침 (http://msdn.microsoft.com/en-us/library/ms229030.aspx)에는 다음과 같은 내용이 명시되어 있습니다. 예외를 throw하여 보고서 실행 오류가 발생하고 오류 코드가 반환되지 않습니다. 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 호출자에게 알릴 수 있습니다.

예외를 throw하는 데는 아무런 문제가 없지만 사람 DTO를 반환하려는 경우 특정 메서드 반환 형식을 사용하는 것이 좋습니다.

+0

감사합니다. Jason - 답장을 기다리는 동안 제가 시도했던 것의 정확한 복제물입니다. 단, 'SaveResult'제네릭을 만들기 위해 모든 객체에 사용할 수 있도록 'PersonDto'대신 'Object'를 사용합니다. – 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) 

이 방법.