2013-08-22 1 views
1

많은 기사를 읽었으며 모든 것이 매우 복잡한 해결책으로 보입니다. 하지만 내 문제를 해결할 수있는 쉬운 방법이 있어야한다고 생각합니다.유효성 검사 오류를 전달하는 방법 EntityFramework에서 WCF로?

리소스에서 오류 메시지를 반환하는 특성을 사용하여 개체에 대한 Entity Framework 유효성 검사를 만들었지 만 (ErrorMessage = ...와 같은 것은 중요하지 않습니다).

[ServiceContract] 
public interface IUser 
{ 
    [OperationContract] 
    User AddUser(User user); 
} 

및 구현 :

public class UserService: IUser 
{ 
    public User AddUser(User user) 
    { 
     //Here I think I should throw the ErrorMessage with a FaultException 
     //and to catch it in the client side, but how to do it !? 

     IUserRepository _user = new UserRepository(); //I've used EF Repository Pattern. 
     return _user.Add(user); 
    } 
} 

답변

2

가장 쉬운 방법은 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 데이터를 복사 할 수도 있습니다. 이 경우 PropertyNameErrorMessage 필드로 다른 데이터 계약을 정의해야하며 각 오류 메시지를 복사하는 코드를 작성해야합니다.

물론, 성가신 부분은 모든 서비스 작업에 대해 동일한 래퍼 코드를 작성해야한다는 것입니다. 래퍼 코드를 도우미 클래스로 옮겨야 할 필요가 있음을 곧 알게되지만 매번 try-catch 코드를 작성해야합니다. 내가 일하는 곳에서 우리는 PostSharp과 함께 aspect 지향 프로그래밍을 사용하여 이와 유사한 문제를 일반화 된 방식으로 해결했다. 메서드에 적용될 때 자동으로 예외를 변환하는 ValidationFaultAspect이라는 측면을 만들었습니다. 나는 PostSharp의 무료 버전으로 그것을 할 수 있다고 생각하지만, 나는 100 % 확실하지 않다.