代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

Castle活动记录(LINQ和验证)问题

  •  1
  • Ronnie Overby  · 技术社区  · 14 年前

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

    整齐 to use LINQ ,您可以:

    1. 我的首选项:使实体继承自 ActiveRecordLinqBase<T> ,然后查询:

      var blogs=(来自blog.queryable select b.tolist()中的b);

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

      var blogs=(从activerecordlinq.asqueryable()中的b中选择b).tolist())

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

    不支持多重继承,下面是我的选项:

    1. 从上面使用2,同时使我的实体继承自 ActiveRecordValidationBase<t> . 缺点:LINQ语句更长更丑。
    2. 创建从继承的类 ActiveRecordLinqBase<t> 并复制在中找到的代码 ActiveRecordValidationBase<t> . 缺点:代码重复,必须用以后的ActiveRecord版本更新。这是课程:

    编辑: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 回复  |  直到 14 年前
        1
  •  3
  •   Mauricio Scheffer    14 年前

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

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

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

    就个人而言,我不认为 ActiveRecordLinq<Blog>.AsQueryable() 比…长得多或更丑 Blog.Queryable 所以我会选择。