가장 쉬운 방법은 DbEntityValidationException
를 잡을과의 FaultException
로 변환하는 것입니다 내 WCF 서비스에서
[MetadataType(typeof(UserMetadata))]
public partial class User
{
internal sealed class UserMetadata
{
[Required(AllowEmptyStrings = false, ErrorMessageResourceName = "UserNameRequired", ErrorMessageResourceType = typeof(ErrorMessage))]
[StringLength(150, ErrorMessageResourceName = "UserNameLength", ErrorMessageResourceType = typeof(ErrorMessage))]
public string UserName { get; set; }
}
}
나는 계약을 체결 원하는 유형. 이 간단한 버전을 설명하겠습니다.
public class UserService: IUser
{
public User AddUser(User user)
{
try
{
IUserRepository _user = new UserRepository(); //I've used EF Repository Pattern.
return _user.Add(user);
}
catch (DbEntityValidationException ex)
{
throw new FaultException<ValidationFault>(new ValidationFault(), ex.Message);
}
}
}
: 예외를 변환
[ServiceContract]
public interface IUser
{
[OperationContract]
[FaultContract(typeof(ValidationFault))]
User AddUser(User user);
}
을 그리고 서비스 코드를 수정 :
[DataContract]
public class ValidationFault
{
}
가 고장이 발생 될 수 있음을 나타 내기 위해 서비스 계약을 수정 먼저 사용자 지정 오류를 만들 에있는 EntityValidationErrors
목록의 DbEntityValidationResult
데이터를 복사 할 수도 있습니다. 이 경우 PropertyName
및 ErrorMessage
필드로 다른 데이터 계약을 정의해야하며 각 오류 메시지를 복사하는 코드를 작성해야합니다.
물론, 성가신 부분은 모든 서비스 작업에 대해 동일한 래퍼 코드를 작성해야한다는 것입니다. 래퍼 코드를 도우미 클래스로 옮겨야 할 필요가 있음을 곧 알게되지만 매번 try-catch 코드를 작성해야합니다. 내가 일하는 곳에서 우리는 PostSharp과 함께 aspect 지향 프로그래밍을 사용하여 이와 유사한 문제를 일반화 된 방식으로 해결했다. 메서드에 적용될 때 자동으로 예외를 변환하는 ValidationFaultAspect
이라는 측면을 만들었습니다. 나는 PostSharp의 무료 버전으로 그것을 할 수 있다고 생각하지만, 나는 100 % 확실하지 않다.