我正在试用Castle ActiveRecord。我想使用验证功能和LINQ功能。
整齐
to use LINQ
,您可以:
-
我的首选项:使实体继承自
ActiveRecordLinqBase<T>
,然后查询:
var blogs=(来自blog.queryable select b.tolist()中的b);
-
使用
ActiveRecordLinq.AsQueryable<T>
,例如:
var blogs=(从activerecordlinq.asqueryable()中的b中选择b).tolist())
现在,要使用验证功能,必须使实体继承自
ActiveRecordValidationBase<T>
.
不支持多重继承,下面是我的选项:
-
从上面使用2,同时使我的实体继承自
ActiveRecordValidationBase<t>
. 缺点:LINQ语句更长更丑。
-
创建从继承的类
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;
}
}
}
}
有更好的方法吗?