2014-05-21 4 views
3

때로는 유효성 검사가 종종 IsNotNullOrWhitespace 이상이되지는 않지만 설정에서 유효성을 검사해야하는 많은 문자열 속성이 포함 된 복잡한 모델이 있습니다.자동 속성 유효성 검사

이렇게하면 불필요한 코드가 반복되는 경우가 있으므로 속성 세터 값을 자동으로 확인하는 방법이 있는지, 궁극적으로 추가 프레임 워크가 없는지 궁금합니다.

가능한 해결책

  • AOP (예를 들어 PostSharp와)
  • 데이터 주석

데이터 주석이 검증으로, 나에게 가장 자연스러운 방법으로 느낌

  • 유창함 검증 모델에 매우 가깝고 닷넷 프레임 워크의 일부이기 때문에 속성은 괜찮습니다. 그러나 MVC 또는 직렬화 외부에서 모델을 사용하는 경우 유효성 검사기를 사용하여 유효성 검사를 수동으로 수행해야합니다. 그래서 나는 아마도 여러 곳 (저장소, API, 서비스)에서 유효성 검증을해야만하고, 어딘가에서 이것을 잊어 버리면 내 도메인 규칙이 깨질 수 있습니다.

    AOP는 완벽한 방법 일 수 있습니다. 그러나 C#에서는 이와 같은 것이 직접 없으며 PostSharp 또는 Ninject (차단)와 같은 인프라 구성 요소에 내 도메인 모델을 밀접하게 연결하는 것은 아니오입니다.

  • +1

    유효성 확인은 언제 수행해야합니까? @ setter를 사용하면 AOP를 사용해야합니다. 무료 인 Fody (https://github.com/Fody/Fody)를 살펴볼 수 있습니다. 인프라 구성 요소와의 연결에 대한 우려가 줄어들 수도 있습니다. 어쨌든 나는 물어야한다 : 당신은 더 많은 코드를 가지고 그것을 지불하고 계속해서 유지 관리 하겠는가 아니면 인프라 구성 요소에 의존하여 개발 속도를 높이고 버그 가능성을 줄이겠는가? 인프라 구성 요소는 무엇이며 그렇지 않은 구성 요소는 무엇입니까? 당신은 VS에 의지합니까 아니면 커플 링이 당신을 너무 괴롭히기 때문에 (모든) 텍스트 편집기를 사용합니까? ;-) – BatteryBackupUnit

    답변

    1

    이 새로운 최소한의 런타임 AOP 프레임 워크 (있는 내가 적극적 일) 도메인 어셈블리를 결합하지 않고 당신이 AOP에 의해 검증을 관리하는 데 도움이 될 수 있습니다 NConcern AOP Framework을보십시오.

    유효성 검사 어셈블리에 고유 한 유효성 검사 특성을 정의하고 유효성 검사를 수행하는 방법을 정의하십시오.

    정의하는 사용자 정의 속성/(검증 사이의 링크를 이메일

    [AttributeUsage(AttributeTargets.Property)] 
    public class Email : Attribute 
    { 
        //validation method to use for email checking 
        static public void Validate(string value) 
        { 
         //if value is not a valid email, throw an exception! 
        } 
    } 
    

    검증 측면 다른 어셈블리에 코드 계약

    //Validation aspect handle all my validation custom attribute (here only email) 
    public class EmailValidation : IAspect 
    { 
        public IEnumerable<IAdvice> Advise(MethodInfo method) 
        { 
         yield return Advice.Before((instance, arguments) => 
         { 
          foreach (var argument in arguments) 
          { 
           if (argument == null) { continue; } 
           Email.Validate(argument.ToString()); 
          } 
         }); 
        } 
    } 
    

    도메인 어셈블리

    public class Customer 
    { 
        [Email] 
        public string Login { get; set; } 
    } 
    

    을 확인하는 식별 및 도메인

    //attach validation to Customer class. 
    foreach (var property in typeof(Customer).GetProperties()) 
    { 
        if (property.IsDefined(typeof(Email), true)) 
        { 
         Aspect.Weave<Validation>(property.GetSetMethod(true)); 
        } 
    }