我正在尝试使用Castle ActiveRecord。我想使用验证功能和LINQ功能。
按顺序to use LINQ,您可以:
我的偏好:让您的实体继承自ActiveRecordLinqBase<T>
,然后查询:
var blogs =(来自Blog.Queryable中的b选择b).ToList();
使用ActiveRecordLinq.AsQueryable<T>
,例如:
var blogs =(来自ActiveRecordLinq.AsQueryable()中的b选择b).ToList()
现在,要使用验证功能,您必须使您的实体继承自ActiveRecordValidationBase<T>
。
不支持多重继承,所以这是我的选择:
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;
}
}
}
}
有更好的方法吗?
答案 0 :(得分:3)
要使用验证功能,您必须使您的实体从ActiveRecordValidationBase继承。
不一定。验证是一个单独的Castle项目,它与ActiveRecord的联系不是很紧密。你可以 run the validation manually。通过手动我的意思是将它包装在您自己的存储库/ DAO类中。
由于它松散耦合,你甚至可以选择任何其他验证框架。
就我个人而言,我认为ActiveRecordLinq<Blog>.AsQueryable()
比Blog.Queryable
更长或更丑,所以我选择这个选项。