2009-09-19 2 views
2

NerdDinner Tutorial을 통해 작업하면서 LINQ-SQL에서 생성 된 부분 클래스에 종속되지 않는 속성에 대한 유효성 검사를 수행하는 좋은 방법을 찾으려고합니다. . 여기에 지금까지 한 일을 몇 가지 예제 코드는 다음과 같습니다LINQ to SQL : OnValidate() 및 사용자 지정 도메인 모델 클래스

이메일은 이메일 테이블을 기반으로 LINQ - 투 - SQL 생성 유형
public abstract class DomainEntity 
{ 
    public IEnumerable<ValidationError> ValidationErrors { get; private set; } 

    public bool Validate() 
    { 
     bool isValid = false; 

     if (this.ValidationErrors != null) 
      this.ValidationErrors = null; 

     this.ValidationErrors = this.GetValidationErrors(); 

     if (this.ValidationErrors.Count() == 0) 
      isValid = true; 

     return isValid; 
    } 

    protected abstract IEnumerable<ValidationError> GetValidationErrors(); 
} 

public partial class Email : DomainEntity 
{ 
    protected override IEnumerable<ValidationError> GetValidationErrors() 
    { 
     if (!this.ValidateAddress()) 
      yield return new ValidationError("Address", DomainResources.EmailAddressValidationErrorMessage); 

     yield break; 
    } 

    partial void OnValidate(ChangeAction action) 
    { 
     bool isValid = this.Validate(); 

     if (!isValid) 
      throw new InvalidEmailException(this); 
    } 

    private bool ValidateAddress() 
    { 
     // TODO: Use a regex to validate the email address. 

     return !string.IsNullOrEmpty(this.Address); 
    } 
} 

. 이메일 테이블은 도메인 모델 클래스 (예 : '사용자')와 관련된 여러 엔터티 중 하나이기 때문에 '사용자'도메인 모델 클래스를 만들고 Validation Application Block 특성을 사용하여 속성의 유효성을 검사하는 것이 이상적입니다. 내 데이터베이스 스키마를 변경하고 변경 내 LINQ - 투 - SQL이 생성 된 클래스를 통해 떨어질 경우

public class User 
{ 
    private Email emailEntity; 

    [EmailAddressValidator] 
    public string EmailAddress 
    { 
     get { return emailEntity.Address; } 
     set { emailEntity.Address = value; } 
    } 
} 

그래서, 나는이 부분적인 분리하지 않아도 : 다른 말로하면,이를 사용하고 싶습니다 수업 (부분 수업 이메일과 같은). 또한 NerdDinner 자습서 에서처럼 Regexes 콜렉션을 유지할 필요가 없도록 Validation Application Block 속성을 통합하는 것이 좋습니다. 또한 도메인 클래스 인 사용자는 뷰 모델 생성, 뷰 렌더링 등 이메일 및 기타 엔티티가 아닌 도메인의 기능 단위가 될 것입니다. 그러나

과 같은 작업을 수행하지 않고도 유효성 검사 호출을 캡처 할 수있는 방법은 없습니다.
public abstract class DomainEntity 
{ 
    public event EventHandler Validation(object sender, EventArgs args); 
    protected void OnValidation() 
    { 
     if (this.Validate != null) 
      this.Validate(this, EventArgs.Empty); 
    } 
} 

public partial class Email 
{ 
    partial void OnValidate(ChangeAction action) 
    { 
     this.OnValidation(); 
    } 
} 

그런 다음 해당 이벤트에 User hook을 넣고 User 내의 모든 유효성 검사를 처리하십시오. 유효성 검사 응용 프로그램 블록에서도 잘 작동합니까? 합리적인 방법으로 사용자와 같은 집계 된 도메인 클래스에서 유효성 검사를 수행하는 방법

+0

참고 : 데이터베이스에 테이블과 같은 "사용자"권한이 있지만 다른 테이블에서 가져올 LINQ-to-SQL 독립 클래스 사용자에 관한 것입니다. 스키마를 변경하면 (비정규 화) 목표는 생성 된 엔티티의 기본 변경 사항을 반영하도록 User 클래스 만 업데이트하는 것입니다. – emptyset

답변

1

유효성 검사를 엔티티의 책임이 아닌 서비스로 간주하면 유효성 검사의 정의와 유효성 검사를 분리하고 암시 적이 아닌 명시적인 작업으로 유효성 검사를 수행 할 수 있습니다 (L2S에서 관리 함).).

이 접근법을 잘 구현하려면 .net (http://www.codeplex.com/FluentValidation)에 대한 유창한 유효성 검사를보십시오.

+0

잘 작동하는 것처럼 보입니다 - 이번 주말에 그걸 가지고 놀려고 노력할 것입니다. – emptyset

0

this 문서를 참조하십시오. Microsoft Validation Application Block을 사용하여 LINQ to SQL의 유효성을 검사하는 방법에 대해 설명합니다.

유효성 검사 응용 프로그램 블록 사용의 트릭에 설명 된대로 특성 기반 유효성 검사 대신 구성 기반 유효성 검사를 사용하는 것입니다. 엔티티가 생성되기 때문에 속성 기반 접근법을 사용하는 것은 거의 불가능합니다.

관련 문제