2010-02-07 4 views
3

내 엔터티에서 유효성 검사를 수행하기 위해 Microsoft 엔터프라이즈 유효성 검사 메서드를 사용하려고합니다.기본 클래스에서 하위 클래스 유형 검색 중?

public class BaseEntity 
{ 
    public bool IsValid() 
    { 
    return Validate().IsValid; 
    } 

    public ValidationResults Validate() 
    { 
    return Validation.Validate<this.GetType()>(this); 
} 

이의 문제가 BaseEntity의 서브 클래스는 IsValid, this.GetType를 호출하는 경우에도()는 항상 BaseEntity이 아닌 서브 클래스의 형식을 반환하는 것입니다 : 내 기본 클래스에서 나는 다음과 같은 방법이있다. 나는 모든 엔티티에 대해이 코드를 다시 작성해야하는 것을 원하지 않는다. 이것을 할 수있는 다른 방법이 있습니까?

보호 된 변수가 Type _validationType으로 보호되어 있고 모든 엔터티에서 해당 엔터티의 .GetType 값으로 설정하겠다는 생각이 들었지만 더 나은 방법이 있어야합니다.

업데이트
명백히 신경 쓰지 마라. 이 .GetType()이 내가 원하는대로 작동하는 것 같습니다. 왜 그것이 전에 없었는지 모르겠습니다.

기본 클래스에 대한 very un-OO like
return ValidationFactory.CreateValidator(this.GetType()).Validate(this); 

답변

2

나는 검증의 또 다른 접근 방식으로 갈 것. 엔티티는 유효성 검사를 완전히 깨끗하게 유지합니다 (이 경우 BaseEntity.Validate()가 없음).이 검증 논리를 ObjectContext (EF)/DataContext (L2S)/Session (NH)로 이동하고 데이터베이스 제출 중에 유효성 검사를 트리거 할 수 있습니다. . SQL에 LINQ 아래의 예를 살펴 보겠습니다 :. 당신의 실체가 유효하지 않은 경우

public partial class NorthwindDataContext 
{ 
    public override void SubmitChanges(ConflictMode failureMode) 
    { 
     var invalidResults = (
      from entity in this.GetChangedEntities() 
      let type = entity.GetType() 
      let validator = ValidationFactory.CreateValidator(type) 
      let results = validator.Validate(entity) 
      where !results.IsValid 
      from result in results 
      select result).ToArray();    

     if (invalidResults.Length > 0) 
     { 
      // You should define this exception type 
      throw new ValidationException(invalidResults); 
     } 

     base.SubmitChanges(failureMode); 
    } 

    private IEnumerable<object> GetChangedEntities() 
    { 
     ChangeSet changes = this.GetChangeSet(); 
     return changes.Inserts.Concat(changes.Updates); 
    } 
} 

, ValidationException가 슬로우됩니다 당신은 특정 예외를 잡아 당신이 그것을 정의하려는 InvalidResults 속성을 반복 할 수 더 많은 정보가 필요합니다.

, 나는 this 기사를 읽어보실 것을 권장합니다. 또한 엔티티 프레임 워크와 함께이 작업을 수행하는 방법에 대해 설명합니다.

,

행운을 빈다.

+0

실제로이를 좋아한다.원래 엔티티 자체에 유효성 검사를 넣는 것을 좋아하지 않았지만 알아낼 수있는 유일한 해결책은 내 nhibernate 클래스와 엔터티 사이에 매우 얇은 레이어를 만드는 것이 었습니다. 이것은 실제로 많은 문제점을 해결합니다. 특히이 게시물로 인해 발견 한 nhibernate 유효성 검사 도구에 대해 사용하면 더욱 그렇습니다. 감사! – KallDrexx

+0

@KallDrexx : 네가 좋아하는 것을 기쁘게 생각한다. 나는 Hibernate에서 어떻게 작동하는지 결코 테스트하지 않았다. 그래서 이것의 예제는 환영 받는다. – Steven

+0

나는 대부분 nhibernate 유효성 검사 라이브러리를 사용하고 추상화 계층으로 xval을 사용하는 예제를 보았습니다. 나는 예제를 열심히 본적이 없다. 우선 xval을 내 애플리케이션에 구현하는 것을 살펴보고, 거기에서 nhibernate를 연결하는 방법을 살펴볼 것이다. (내가 보는 모든 것은 유효성 검증 라이브러리에 핸들러를 ISession에 연결). – KallDrexx

2

는 서브 클래스에 대해 아무것도 알고 :

은 또한 다음 코드를 사용하여 내 유효성 검사() 메소드를 변경했습니다. 이것은 제대로 작동해야합니다.

하위 클래스에 대해 알고 싶다면이 메서드를 재정의해야합니다.

0

하위 클래스에 몇 가지 사용자 지정 정의를 제공하는 가상 메서드 인 IsValid()Validate()을 만들 수 있습니다.

0

BaseEntity에서 유형 논리를 제거하는 것이 더 깔끔합니다. 당신은 엔티티에 SQL, 자 NHibernate 또는 LINQ에 LINQ (ADO.NET 엔티티 프레임 워크)와 같은 O/RM 매퍼를 사용하는 경우

public class BaseEntity 
{ 
    public bool IsValid() 
    { 
     return Validate().IsValid; 
    } 

    public ValidationResults Validate() 
    { 
     return Validation.Validate(this); 
    } 
} 
public class Validation 
{ 
    public static ValidatorResults Validator<T>(T entity) 
     where T : BaseEntity 
    { 
     return ValidationFactory.CreateValidator(entity.GetType()).Validate(entity); 
    } 
} 
1

유효성 검사에 관한 모든 것들을 제외하고는, 어떤 실제 서브 클래스 유형이 호출되는지를 알려주는 baseclass 메소드를 코딩하는 방법이 있습니다.

글쎄 ... 적어도 규칙, Gabriel을 깨지 않고 가장하는 방법. 그것은 매우 우아하고 완벽하게 잘 작동합니다

public ValidationResults Validate<TEntity>(this TEntity e) where TEntity : BaseEntity 
{ 
    return Validation.Validate<TEntity>(e); 
} 

다른 사람의 사이에서 확장 방법의 큰 장점 ... :)

관련 문제