1

インターフェイス IValidatable を実装する IEntity インターフェイスがあります。

public interface IValidatable {
    bool IsValid { get; }
    bool IsValidForPersistence { get; }
    // Rules applied at UI time (please enter your name, etc)
    IEnumerable<RuleViolation> GetRuleViolations();
    // Rules to be applied only at persistence time
    IEnumerable<RuleViolation> GetPersistenceRuleViolations();
}

public interface IEntity : IValidatable {
    int ID { get; set; }
}

便宜上、次のような Entity クラスを実装しました。

 public abstract class Entity : IEntity {

        public virtual int ID { get; set; }

        public virtual bool IsValid {
            get { return RuleViolations().Count() == 0; }
        }

        public virtual bool IsValidForPersistence {
            get { return PersistenceRuleViolations().Count() == 0; }
        }

        public virtual IEnumerable<RuleViolation> GetRuleViolations() {
            return new List<RuleViolation>();
        }

        public virtual IEnumerable<RuleViolation> GetPersistenceRuleViolations() {
            return new List<RuleViolation>();
        }
    }

デフォルトでは、GetRuleViolations() または GetPersistenceRuleViolations() がオーバーライドされるまで、エンティティは有効です。

  public partial class Company {

      public override IEnumerable<RuleViolation> GetRuleViolations() {
         if (String.IsNullOrEmpty(CompanyName))
                yield return new RuleViolation("CompanyName", "Name is required.");
     }

      public override IEnumerable<RuleViolation> GetPersistenceRuleViolations() {
         // Include standard rules too
         foreach (RuleViolation rule in RuleViolations) {
              yield return rule;
          }
        // Check some data based on a referenced entity "Bid"
        if (!Active && Bid.Active)
            yield return new RuleViolation("Active", 
               "When Active is set to false, the Bid must also be inactive.");
     }
  }

これは検証が少し単純であることを知っているので、タイプミス以外に何を改善できるでしょうか?

4

3 に答える 3

1

たとえば、エンティティを別のエンティティから派生させる場合は、覚えておいてください。Person から Customer を取得するには、基本クラスの違反を取得するために foeach が必要です。

  public override IEnumerable<RuleViolation> GetRuleViolations() 
  {
     // inherit base class valiations
     foreach (var violation in base.GetRuleViolations())
     {
         yield return violation;
     }

     // add own validations
     if (String.IsNullOrEmpty(CompanyName))
         yield return new RuleViolation("CompanyName", "Name is required.");
  }

これはあまり良くありません。

個人的には、検証は一般的な問題であり、すでに多くの解決策があるため、既存のものも探します。

于 2009-10-08T00:54:51.490 に答える
1

優れたビジネス ルールと検証ベース フレームワークを持つ NCommon フレームワーク、または同じルールセットからのクライアント側の検証もサポートする xVal 検証フレームワークのいずれかを検討することをお勧めします。

于 2009-10-07T22:31:26.017 に答える
0

私は ASP.NET MVC を使用しており、Data Annotation Validators で同様のことを行っています。ただし、エラーをまとめて返すことができるように、継承しValidationAttributeてオーバーライドします。FormatErrorMessage

于 2009-10-07T22:35:29.947 に答える