数据映射字段业务规则:FieldRuleAttribute
来源:互联网 发布:美国种族矛盾 知乎 编辑:程序博客网 时间:2024/06/05 08:00
using System;
namespace Phenix.Core.Mapping
{
/// <summary>
/// "数据映射字段业务规则"标签
/// </summary>
[Serializable()]
[AttributeUsage(AttributeTargets.Field)]
public sealed class FieldRuleAttribute : Attribute
{
#region 属性
private static string _defaultUpperCaseFriendlyName = "代码";
/// <summary>
/// 缺省可以强制转换成大写的 FriendlyName 的匹配子字符串, 可以';'分隔
/// </summary>
public static string DefaultUpperCaseFriendlyName
{
get { return _defaultUpperCaseFriendlyName; }
set { _defaultUpperCaseFriendlyName = value; }
}
private static string _defaultOnImeModeFriendlyName = "中文名";
/// <summary>
/// 缺省可以输入中文的 FriendlyName 的匹配子字符串, 可以';'分隔
/// </summary>
public static string DefaultOnImeModeFriendlyName
{
get { return _defaultOnImeModeFriendlyName; }
set { _defaultOnImeModeFriendlyName = value; }
}
#region 字符串
private bool? _stringUpperCase;
/// <summary>
/// 指示该字段内容是否强制转换成大写(true 为 CharacterCasing.Upper, false 为 CharacterCasing.Lower, 不赋值的情况下为 CharacterCasing.Normal)
/// 当 FriendlyName 包含 DefaultUpperCaseFriendlyName 时不必在此申明
/// 为 Phenix.Services.Client.Validation.ResetEditCharacterCasing() 实现其功能
/// </summary>
public bool StringUpperCase
{
get { return _stringUpperCase.Value; }
set { _stringUpperCase = value; }
}
public bool StringUpperCaseHasValue
{
get { return _stringUpperCase.HasValue; }
}
private bool? _stringOnImeMode;
/// <summary>
/// 指示该字段内容是否可以输入中文(true 为 ImeMode.On, false 为 ImeMode.Off, 不赋值的情况下为 ImeMode.Inherit)
/// 当 FriendlyName 包含 DefaultOnImeModeFriendlyName 时不必在此申明
/// 为 Phenix.Services.Client.Validation.ResetEditImeMode() 实现其功能
/// </summary>
public bool StringOnImeMode
{
get { return _stringOnImeMode.Value; }
set { _stringOnImeMode = value; }
}
public bool StringOnImeModeHasValue
{
get { return _stringOnImeMode.HasValue; }
}
private int? _stringMaxLength;
/// <summary>
/// 允许字符串最大长度
/// </summary>
public int StringMaxLength
{
get { return _stringMaxLength.Value; }
set { _stringMaxLength = value; }
}
public bool MaxLengthHasValue
{
get { return _stringMaxLength.HasValue; }
}
private int? _stringMinLength;
/// <summary>
/// 允许字符串最小长度
/// </summary>
public int StringMinLength
{
get { return _stringMinLength.Value; }
set { _stringMinLength = value; }
}
public bool StringMinLengthHasValue
{
get { return _stringMinLength.HasValue; }
}
#endregion
#region 数字
private decimal? _numberMaxValue;
/// <summary>
/// 允许数字最大值
/// </summary>
public decimal NumberMaxValue
{
get { return _numberMaxValue.Value; }
set { _numberMaxValue = value; }
}
public bool NumberMaxValueHasValue
{
get { return _numberMaxValue.HasValue; }
}
private decimal? _numberMinValue;
/// <summary>
/// 允许数字最小值
/// </summary>
public decimal NumberMinValue
{
get { return _numberMinValue.Value; }
set { _numberMinValue = value; }
}
public bool NumberMinValueHasValue
{
get { return _numberMinValue.HasValue; }
}
#endregion
#region 时间
private TimeSpan? _dateTimeStartTimeSpan;
/// <summary>
/// 允许时间范围起始值(相对当前时间)
/// </summary>
public TimeSpan DateTimeStartTimeSpan
{
get { return _dateTimeStartTimeSpan.Value; }
}
public bool DateTimeStartTimeSpanHasValue
{
get { return _dateTimeStartTimeSpan.HasValue; }
}
/// <summary>
/// 允许时间范围起始值(相对当前时间), 指定天数
/// </summary>
public double DateTimeStartTimeSpanFromDays
{
get { return _dateTimeStartTimeSpan.Value.TotalDays; }
set { _dateTimeStartTimeSpan = TimeSpan.FromDays(value); }
}
/// <summary>
/// 允许时间范围起始值(相对当前时间), 指定小时数
/// </summary>
public double DateTimeStartTimeSpanFromHours
{
get { return _dateTimeStartTimeSpan.Value.TotalHours; }
set { _dateTimeStartTimeSpan = TimeSpan.FromHours(value); }
}
/// <summary>
/// 允许时间范围起始值(相对当前时间), 指定分钟数
/// </summary>
public double DateTimeStartTimeSpanFromMinutes
{
get { return _dateTimeStartTimeSpan.Value.TotalMinutes; }
set { _dateTimeStartTimeSpan = TimeSpan.FromMinutes(value); }
}
private TimeSpan? _dateTimeEndTimeSpan;
/// <summary>
/// 允许时间范围结束值(相对当前时间)
/// </summary>
public TimeSpan DateTimeEndTimeSpan
{
get { return _dateTimeEndTimeSpan.Value; }
}
public bool DateTimeEndTimeSpanHasValue
{
get { return _dateTimeEndTimeSpan.HasValue; }
}
/// <summary>
/// 允许时间范围结束值(相对当前时间), 指定天数
/// </summary>
public double DateTimeEndTimeSpanFromDays
{
get { return _dateTimeEndTimeSpan.Value.TotalDays; }
set { _dateTimeEndTimeSpan = TimeSpan.FromDays(value); }
}
/// <summary>
/// 允许时间范围结束值(相对当前时间), 指定小时数
/// </summary>
public double DateTimeEndTimeSpanFromHours
{
get { return _dateTimeEndTimeSpan.Value.TotalHours; }
set { _dateTimeEndTimeSpan = TimeSpan.FromHours(value); }
}
/// <summary>
/// 允许时间范围结束值(相对当前时间), 指定分钟数
/// </summary>
public double DateTimeEndTimeSpanFromMinutes
{
get { return _dateTimeEndTimeSpan.Value.TotalMinutes; }
set { _dateTimeEndTimeSpan = TimeSpan.FromMinutes(value); }
}
#endregion
#endregion
}
}
在类字段上定义上面的校验规则后,框架自动将这些规则注入到业务类的规则库里。
这种方式等效于自己写代码添加校验规则:
/// <summary>
/// 程序集类
/// </summary>
[Serializable()]
[Phenix.Core.Mapping.Class("PH_AssemblyClass")]
public class AssemblyClass : Phenix.Business.BusinessBase<AssemblyClass>
{
....
private static Csla.PropertyInfo<string> _AC_NameProperty =
RegisterProperty<string>(typeof(AssemblyClass), new Csla.PropertyInfo<string>("AC_Name", "名称"));
[Phenix.Core.Mapping.Field(NeedUpdate = true, FriendlyName = "名称")]
//[Phenix.Core.Mapping.FieldRule(StringMaxLength = 30, StringMinLength = 10)]
private string _AC_Name;
/// <summary>
/// 名称
/// </summary>
public string AC_Name
{
get { return GetProperty<string>(_AC_NameProperty, _AC_Name); }
set { SetProperty<string>(_AC_NameProperty, ref _AC_Name, value); }
}
...
/// <summary>
/// 添加校验规则
/// </summary>
protected override void AddBusinessRules()
{
base.AddBusinessRules();
//与 [Phenix.Core.Mapping.FieldRule(StringMaxLength = 30, StringMinLength = 10)] 作用等效
ValidationRules.AddRule(Phenix.Business.Validation.CommonRules.StringMaxLength, new Phenix.Business.Validation.CommonRules.StringMaxLengthRuleArgs(_AC_NameProperty.PropertyName, _AC_NameProperty.FriendlyName, 30));
ValidationRules.AddRule(Phenix.Business.Validation.CommonRules.StringMinLength, new Phenix.Business.Validation.CommonRules.StringMinLengthRuleArgs(_AC_NameProperty.PropertyName, _AC_NameProperty.FriendlyName, 10));
}
}
}
当然这么做毕竟没有用FieldRuleAttribute来的更加简洁明了。
- 数据映射字段业务规则:FieldRuleAttribute
- 数据映射字段业务规则:FieldRuleAttribute
- 将关系数据映射到业务实体
- springmvc 路径映射规则、数据绑定
- Google Gson:POJO 和 JSON 的字段映射规则
- JPA之大数据字段映射与字段延迟加载
- 通过 WPF 强制执行复杂的业务数据规则
- e-企业管理解决方案-业务数据字段任意设置
- Activiti 5.17 --从Activiti的业务对象到MyBatis SQL Mapping ID的映射规则
- Dynamics CRM 2015Online Update1 new feature之 通过业务规则清空字段的值
- Hibernate联合主键映射规则和数据查询原理
- 业务规则的可订制
- OCL指南:业务规则
- 业务规则成资产
- 业务规则分类
- 业务规则引擎管理
- 年终结转业务规则
- 业务规则入门简介
- C++构造函数中的初始化
- LUA编译
- 转 spring库导入
- 接口问题
- linux 文件遍历
- 数据映射字段业务规则:FieldRuleAttribute
- J2EE笔记——Web基础
- 工作流管理系统(WfMS)介绍
- WfMC的Workflow参考模型
- Phenix应用系统安装部署方法 .
- 浮躁的程序员
- 2012 1 13
- CSLA如何动态控制权限的问题 .
- delphi开发ocx的几点