Скажите, что глупо в моей проверке сущности (и как ее улучшить) - PullRequest
1 голос
/ 08 октября 2009

У меня есть интерфейс IEntity, который реализует интерфейс, IValidatable

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.");
     }
  }

Я знаю, что это немного наивно для проверки, так что, кроме любых опечаток, что можно улучшить?

Ответы [ 3 ]

1 голос
/ 08 октября 2009

Имейте в виду, если вы производите сущность от другого, например. Клиент от персоны, вам нужен фоеч, чтобы получить нарушения базовых классов:

  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.");
  }

Что не так приятно.

Лично я бы также искал что-то существующее, потому что валидация - это общая проблема, и для нее уже есть много решений.

1 голос
/ 08 октября 2009

Я бы порекомендовал взглянуть либо на платформу NCommon, которая имеет хорошие бизнес-правила и базовую платформу валидации, либо на платформу валидации xVal, которая также поддерживает валидацию на стороне клиента из того же набора правил.

0 голосов
/ 08 октября 2009

Я использую ASP.NET MVC и делаю нечто подобное с валидаторами аннотаций данных. Однако я наследую от ValidationAttribute, а также переопределяю FormatErrorMessage, чтобы я мог возвращать ошибки коллективно.

...