Проблема с активной записью замка (Linq AND Validation)
Я испытываю замок ActiveRecord. Я хочу использовать функции проверки и функции LINQ.
Чтобы использовать LINQ, вы можете:
Мои предпочтения: сделать ваши объекты наследовать от
ActiveRecordLinqBase<T>
затем запросить:var blogs = (из b в Blog.Queryable выберите b).ToList();
использование
ActiveRecordLinq.AsQueryable<T>
Например:var blogs = (из b в ActiveRecordLinq.AsQueryable() выберите b).ToList ()
Теперь, чтобы использовать функции проверки, вы должны заставить свои объекты наследовать от ActiveRecordValidationBase<T>
,
Множественное наследование не поддерживается, поэтому, вот мои варианты:
- Используйте #2 сверху, чтобы мои объекты наследовали от
ActiveRecordValidationBase<T>
, Недостаток: операторы LINQ длиннее и страшнее. - Создайте класс, который наследует от
ActiveRecordLinqBase<T>
и дублирует код, найденный вActiveRecordValidationBase<T>
, Недостаток: дублированный код, который должен быть обновлен в будущих выпусках 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;
}
}
}
}
Есть ли способ лучше?
1 ответ
чтобы использовать функции проверки, вы должны заставить свои объекты наследоваться от ActiveRecordValidationBase.
Не обязательно. Валидация - это отдельный проект Castle, он не очень тесно связан с ActiveRecord. Вы можете запустить проверку вручную. Под ручным я подразумеваю оборачивание этого в ваш собственный класс репозитория /DAO
А поскольку он слабо связан, вы можете даже выбрать любую другую платформу валидации.
Лично я не считаю ActiveRecordLinq<Blog>.AsQueryable()
быть намного длиннее или страшнее, чем Blog.Queryable
так что я бы пошел с этим вариантом.