C# Castle活动记录(Linq和验证)问题

C# Castle活动记录(Linq和验证)问题,c#,.net,nhibernate,activerecord,castle-activerecord,C#,.net,Nhibernate,Activerecord,Castle Activerecord,我正在试用这张唱片。我想使用验证功能和LINQ功能 按顺序,您可以: 我的首选项:使您的实体从ActiveRecordLinqBase继承,然后查询: var blogs=来自Blog.Queryable中的b选择b.ToList 使用ActiveRecordLinq.AsQueryable,例如: var blogs=从ActiveRecordLinq.AsQueryable中的b选择b.ToList 现在,要使用验证功能,必须使实体从ActiveRecordValidationBase继承

我正在试用这张唱片。我想使用验证功能和LINQ功能

按顺序,您可以:

我的首选项:使您的实体从ActiveRecordLinqBase继承,然后查询:

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

使用ActiveRecordLinq.AsQueryable,例如:

var blogs=从ActiveRecordLinq.AsQueryable中的b选择b.ToList

现在,要使用验证功能,必须使实体从ActiveRecordValidationBase继承

不支持多重继承,因此,以下是我的选项:

使用上面的2,同时使我的实体从ActiveRecordValidationBase继承。缺点:LINQ语句更长更难看。 创建一个从ActiveRecordLinqBase继承并复制ActiveRecordValidationBase中的代码的类。缺点:重复的代码,必须在将来的ActiveRecord版本中更新。下面是课程: 编辑:3。未测试缺点:必须使属性和方法定义与更新保持同步

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;
            }
        }
    }
}
有更好的办法吗

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

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

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

个人而言,我不认为ActureCordLnq.AcQueQuestube比Blog要长得多或更丑。