2010-12-07 8 views
6

다음 요구 사항이있는 우리 부서의 데이터 유효성 검사 유틸리티를 작성 중입니다. - 동적으로 새 비즈니스 엔터티를 추가합니다. - 동적으로 엔터티에 새 유효성 검사를 추가합니다. - 비즈니스 엔터티 및 해당 유효성 목록 목록을 표시하는 UI - 사용자는 전체 또는 선택된 비즈니스 엔터티 유효성 검사에서 유효성 검사를 시작할 수있는 옵션을 갖습니다. - 유효성 검사에 실패하면 UI에 유효성 검사 오류 메시지가 표시됩니다. - 유효성 검사가 실패하여 모든 유효성 검사가 유효화 되더라도 시스템은 다음 유효성 검사로 진행해야합니다.유효성 검사 디자인 패턴

인터넷을 검색 한 후 내 비즈니스 요구 사항 하나의 ID 장식 패턴을 만족시키는 2 개의 약속 패턴을 찾았고 다른 하나는 사슬 체인 (Responsibilty)이라고도합니다. 이제 내 질문이 더 나아 졌어? 누구든지 더 좋은 아이디어가있어?

덕분에

+0

질문을 수정해야 할 수도 있습니다. 커맨드 패턴 체인과 함께하고 싶은 일을 분명히 할 수 있습니까? –

답변

7

나는 당신이 원하는 것은 Specification Pattern 생각합니다. 그래서 당신은 이런 짓을 할 것이다 :

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject> 
{ 
    public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject) 
    { 
    return myBusinessObject.StartDate >= DateTime.Now; 
    } 
} 

이 패턴의 좋은 점은 각 규칙은 격리에서 쉽게 테스트 할 수 있다는 것이다 당신이이 부과 몇 가지 프레임 워크에 반대 (유효성 검사 규칙을 적용 할 때 선택할 수 당신에 대한 결정).

4

사양 패턴도 사용하고 있습니다. 이것이 기본 구현입니다. 이 구현으로

public class Specification<T, E> : ISpecification<T, E> 
{ 
    private Predicate<T> predicate; 

    public Specification(Predicate<T> predicate) 
    { 
     this.predicate = predicate; 
    } 

    public bool IsSatisfiedBy(T candidate) 
    { 
     return this.predicate.Invoke(candidate); 
    } 
} 

, 난 그냥 다음과 같이 생성자에서 술어를 통과 대신 여러 클래스의

var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod()); 

(각 조건 별 하나를 내 도메인에), 나는 몇 가지 부울 방법을 내 비즈니스 개체.

+0

더 많은 설명 클래스/메소드 이름을 포함하도록 샘플 사용 코드를 추가/다시 작성 하시겠습니까? –