2012-03-11 19 views
18

Doğrulama amacıyla Specification kalıbını kullanmayı düşünüyorum. Zor olan şey, kullanıcıya bazı özelliklerin neden karşılanmadığını anlatmaktır. Ne Specification.IsSatisfiedBy() sadece bool değerini değil, aynı zamanda başarısızlık nedenini de döndürecektir. Böyle bir şey olacaktır:DDD Doğrulama için desen desenini kullanma

interface ISpecification<T> 
{ 
    CheckResult IsSatisfiedBy(T candidate); 
} 

CheckResult olduğu:

class CheckResult 
{ 
    public bool IsSatisfied { get; } 
    public string FailureReason { get; } 
} 

eser Fowler & Evans Amaç tam olarak memnun değildi neyi açıklama sağlamaktır Kısmen Memnun şartnamenin bir kavram vardır. Ancak, bu belgede, Adayı Adayı tarafından sağlanamayan Spesifikasyonu döndüren kalanıUsatisfiedBy ek yöntemi olarak uygulanır.

Soru şu: Doğrulama için belirtimi kullanırken, belirli bir Spesifikasyonun sağlanamadığı kullanıcıya nasıl geri bildirim sağlanabilir? Yukarıda sunduğum çözüm iyi mi?

+0

Her şeyden önce, Şartname'nin gitmenin yolu olduğuna gerçekten emin misiniz? Yani, her bir özellik bir modelin geçerli olabileceği veya geçerli olmadığı bağlamı biliyor mu? Alanın neye benzediğini bilmediğimden çok fazla şey söyleyemem. Bazı basit doğrulama için bunun iyi olduğunu düşünüyorum, ancak DataAnnotation doğrulama öznitelikleri şu anda yapıyor. – MikeSW

cevap

17

Teknik özellikler sınıflarınızı doğrulama için kullanabilmenize rağmen, bunları etki alanınızda ayrı kavramlar olarak tutmanızı öneririm. Aynı temel özellikleri tekrar kullanmanız gerektiğini ancak amaç ve içeriğe bağlı olarak farklı "Arıza Nedenleri" getirmeniz gerektiğini görebilirsiniz. Daha fazla ayrıntı için bkz. this article.

Yukarıda atıfta bulunulan yazının yazarı, aynı zamanda github'a kibarca paylaşılan kodu da içerir ve kodu NCommon olarak gönderir. Özellikle bu alanları gözden geçirin:

Özellikler: https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Specifications

Doğrulamaları: Ben de aynı sorun vardı

+1

Güzel. Cevap için teşekkürler. – Markus

+0

Yardım etti, şansın en iyisi –

+2

codeinsanity'den örnek FluentValidation'e benziyor :) – dariol

4

https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Rules (ValidationResult ve ValidationError için özellikle sınıflar). Spesifikasyon için Doğrulama dekoratörü oluşturuyorum (kod JAVA'dır).

interface Validator<T>{ 
    Respond validate(T t) 
    } 


    class abstract ValidationSpecificationDecorator<T> implements Validator<T> { 
    Specification<T> spec; 

    ValidationSpecificationDecorator(Specification<T> spec){ 
    this.spec = spec; 
    } 

    public Respond validate(T t) { 
    Respond respond = new Respond(); 
    if(!spec.IsSatisfiedBy(t){ 
     respond.add(error(t)); 
    } 
    return respond; 
) 

    public abstract Error error(T t); 

    }