C# Castle活动记录(Linq和验证)问题
我正在试用这张唱片。我想使用验证功能和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。未测试缺点:必须使属性和方法定义与更新保持同步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继承
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要长得多或更丑。