城堡活动记录(Linq和验证)问题

时间:2010-06-07 13:06:53

标签: c# .net nhibernate activerecord castle-activerecord

我正在尝试使用Castle ActiveRecord。我想使用验证功能和LINQ功能。

按顺序to use LINQ,您可以:

  1. 我的偏好:让您的实体继承自ActiveRecordLinqBase<T>,然后查询:

    var blogs =(来自Blog.Queryable中的b选择b).ToList();

  2. 使用ActiveRecordLinq.AsQueryable<T>,例如:

    var blogs =(来自ActiveRecordLinq.AsQueryable()中的b选择b).ToList()

  3. 现在,要使用验证功能,您必须使您的实体继承自ActiveRecordValidationBase<T>

    不支持多重继承,所以这是我的选择:

    1. 使用上面的#2,同时让我的实体继承自ActiveRecordValidationBase<T>。缺点:LINQ语句更长且更丑。
    2. 创建一个继承自ActiveRecordLinqBase<T>的类,并复制ActiveRecordValidationBase<T>中的代码。缺点:重复的代码,必须使用将来的ActiveRecord版本进行更新。这是班级:
    3. 编辑:3.(未经测试)Simulate multiple inheritance.缺点:必须使属性和方法定义与更新保持同步。

      using System;
      using System.Collections;
      using System.Xml.Serialization;
      using Castle.ActiveRecord.Framework;
      using Castle.Components.Validator;
      using NHibernate.Type;
      
      namespace Castle.ActiveRecord.Linq
      {
          [Serializable]
          public abstract class ActiveRecordValidationLinqBase<T> : ActiveRecordLinqBase<T>, IValidationProvider where T : class
          {
              // Fields
              [NonSerialized]
              private IValidationProvider _actualValidator;
      
              // Methods
              protected ActiveRecordValidationLinqBase() { }
      
              protected override bool BeforeSave(IDictionary state)
              {
                  if (!this.IsValid(RunWhen.Insert))
                  {
                      this.OnNotValid();
                  }
                  return base.BeforeSave(state);
              }
      
              public virtual bool IsValid()
              {
                  return this.ActualValidator.IsValid();
              }
      
              public virtual bool IsValid(RunWhen runWhen)
              {
                  return this.ActualValidator.IsValid(runWhen);
              }
      
              protected override bool OnFlushDirty(object id, IDictionary previousState, IDictionary currentState, IType[] types)
              {
                  if (!this.IsValid(RunWhen.Update))
                  {
                      this.OnNotValid();
                  }
                  return base.OnFlushDirty(id, previousState, currentState, types);
              }
      
              protected virtual void OnNotValid()
              {
                  ActiveRecordValidator.ThrowNotValidException(this.ValidationErrorMessages, this.PropertiesValidationErrorMessages);
              }
      
              // Properties
              [XmlIgnore]
              protected virtual IValidationProvider ActualValidator
              {
                  get
                  {
                      if (this._actualValidator == null)
                      {
                          this._actualValidator = new ActiveRecordValidator(this);
                      }
                      return this._actualValidator;
                  }
              }
      
              [XmlIgnore]
              public virtual IDictionary PropertiesValidationErrorMessages
              {
                  get
                  {
                      return this.ActualValidator.PropertiesValidationErrorMessages;
                  }
              }
      
              public virtual string[] ValidationErrorMessages
              {
                  get
                  {
                      return this.ActualValidator.ValidationErrorMessages;
                  }
              }
          }
      }
      

      有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

  

要使用验证功能,您必须使您的实体从ActiveRecordValidationBase继承。

不一定。验证是一个单独的Castle项目,它与ActiveRecord的联系不是很紧密。你可以 run the validation manually。通过手动我的意思是将它包装在您自己的存储库/ DAO类中。

由于它松散耦合,你甚至可以选择任何其他验证框架。

就我个人而言,我认为ActiveRecordLinq<Blog>.AsQueryable()Blog.Queryable更长或更丑,所以我选择这个选项。