wojilu系统的ORM代码解析-[源代码结构分析,用特性和反射来感知属性-特性介绍篇]
2011-06-29 09:28
615 查看
我们知道,ORM最主要的功能是自动化,如何更具类的属性来自动生成对应的数据表,这个是ORM的一个研究重点。wojilu的实现方法是在属性上增加特性attr,通过运行时的反射Reflection来感知属性的特性,决定数据映射的策略。
本文里面的【批注】一词出于源代码,和特性是指同一个意思。我本人比较喜欢说【特性】。
打开wojilu源代码,wojilu/orm/attribute 里面有很多特性的类,wojilu就是通过他们来知道类里面的属性,希望怎么映射为数据库里面的字段。
CacheCountAttribute:count 缓存批注 这个将在wojilu缓存里面详细解释
ColumnAttribute:数据列批注,用于标识属性在数据库中对应的列名称和长度
1 /// <summary>
2 /// 数据列批注,用于标识属性在数据库中对应的列名称和长度
3 /// </summary>
4 [Serializable, AttributeUsage( AttributeTargets.Property )]
5 public class ColumnAttribute : Attribute {
6 private String _columnName;
7 private String _label;
8 private int _length;
9
public ColumnAttribute() {
_length = 250;
}
public String Name {
get {
return _columnName;
}
set {
_columnName = value;
}
}
public String Label {
get {
return _label;
}
set {
_label = value;
}
}
public int Length {
get {
return _length;
}
set {
_length = value;
}
}
public Boolean LengthSetted() {
return _length > 0 && _length != 250;
}
这里表示一个字段在数据库里面的列的信息,LABEL和NAME的不同之处在于,LABEL是在提交表单的时候,使用的名称,NAME是在数据库里面使用的名称。这里的LengthSetted其实是有问题的,如果Length大于0,这个条件没有问题,length不等于250是有BUG的。这里正确的做法是设置一个Flg进行判断,在Length属性的Set的时候将Flg设定为True,然后LengthSetted返回这个Flg就可以了。250这个不是MagicNumber,很有可能别人设定的长度就是250。
DatabaseAttribute:数据库批注 这里只是设定了数据库的名称
DecimalAttribute:用于自定义精度数据,也可以存储自定义精度的货币数值。这个是解决浮点数的特性,通过这个特性,我们可以自定义数字在数据库里面的精度
1 /// <summary>
2 /// 用于自定义精度数据,也可以存储自定义精度的货币数值。
3 /// </summary>
4 [Serializable, AttributeUsage( AttributeTargets.Property )]
5 public class DecimalAttribute : Attribute {
6
7 /// <summary>
8 /// 数值的精度,即小数点左右的总共位数,但不包括小数点。
9 /// </summary>
public int Precision { get; set; }
/// <summary>
/// 小数点右侧的位数
/// </summary>
public int Scale { get; set; }
不过,这里没有进行安全检查,例如小数位数不可以超过整数位数。如果要做的完美的话,应该有一个检查的。特性的时候,异常处理的方法,我不是很清楚,难道在写代码的时候,Enter按下后,出现红色错误下划线?
DefaultAttribute: 默认值批注,当属性没有被赋值的时候,系统使用此默认值存入数据库
HtmlTextAttribute: html 文本批注,表明此属性允许接受 html 风格的文本
LabelAttribute: label 批注,用于表单代码的自动生成
这个特性,请注意和ColumnAttribute之间的联系。ColumnAttribute里面也有一个Label的家伙。
LongTextAttribute:
长文本批注,标识此属性对应的数据列允许接受长文本字符串
MoneyAttribute:货币批注,可以保存货币类型数据。 此批注只能用在dotnet的decimal数据类型上。数据库存储的时候,使用的精度为:总位数19, 小数点后4位 这个特性是DecimalAttribute的一个特例,当然你也可以写为DecimalAttribute。
但是,日币等没有小数点的货币,可能不适合使用MoneyAttribute。
NotSaveAttribute: ORM在保存数据的时候,会忽略打上 NotSave 批注的属性
NotSerializeAttribute 在 json 序列化的时候,打上 NotSerialize 批注的属性会被忽略 在NET的序列化里面也有同样的【NotSerialize】特性,有这个特性的东西,不需要序列化。
AttributeUsage:
表名称批注,用于标识对象在数据库中对应的表名称 TinyIntAttribute:
小型整数批注,标识此属性对应的数据列为小型整数wojilu的很多地方都用到了反射,不过由于wojilu有完备的缓存系统,对于性能上的损失来说,可以忽略不计。
本文里面的【批注】一词出于源代码,和特性是指同一个意思。我本人比较喜欢说【特性】。
打开wojilu源代码,wojilu/orm/attribute 里面有很多特性的类,wojilu就是通过他们来知道类里面的属性,希望怎么映射为数据库里面的字段。
CacheCountAttribute:count 缓存批注 这个将在wojilu缓存里面详细解释
ColumnAttribute:数据列批注,用于标识属性在数据库中对应的列名称和长度
1 /// <summary>
2 /// 数据列批注,用于标识属性在数据库中对应的列名称和长度
3 /// </summary>
4 [Serializable, AttributeUsage( AttributeTargets.Property )]
5 public class ColumnAttribute : Attribute {
6 private String _columnName;
7 private String _label;
8 private int _length;
9
public ColumnAttribute() {
_length = 250;
}
public String Name {
get {
return _columnName;
}
set {
_columnName = value;
}
}
public String Label {
get {
return _label;
}
set {
_label = value;
}
}
public int Length {
get {
return _length;
}
set {
_length = value;
}
}
public Boolean LengthSetted() {
return _length > 0 && _length != 250;
}
这里表示一个字段在数据库里面的列的信息,LABEL和NAME的不同之处在于,LABEL是在提交表单的时候,使用的名称,NAME是在数据库里面使用的名称。这里的LengthSetted其实是有问题的,如果Length大于0,这个条件没有问题,length不等于250是有BUG的。这里正确的做法是设置一个Flg进行判断,在Length属性的Set的时候将Flg设定为True,然后LengthSetted返回这个Flg就可以了。250这个不是MagicNumber,很有可能别人设定的长度就是250。
DatabaseAttribute:数据库批注 这里只是设定了数据库的名称
DecimalAttribute:用于自定义精度数据,也可以存储自定义精度的货币数值。这个是解决浮点数的特性,通过这个特性,我们可以自定义数字在数据库里面的精度
1 /// <summary>
2 /// 用于自定义精度数据,也可以存储自定义精度的货币数值。
3 /// </summary>
4 [Serializable, AttributeUsage( AttributeTargets.Property )]
5 public class DecimalAttribute : Attribute {
6
7 /// <summary>
8 /// 数值的精度,即小数点左右的总共位数,但不包括小数点。
9 /// </summary>
public int Precision { get; set; }
/// <summary>
/// 小数点右侧的位数
/// </summary>
public int Scale { get; set; }
不过,这里没有进行安全检查,例如小数位数不可以超过整数位数。如果要做的完美的话,应该有一个检查的。特性的时候,异常处理的方法,我不是很清楚,难道在写代码的时候,Enter按下后,出现红色错误下划线?
DefaultAttribute: 默认值批注,当属性没有被赋值的时候,系统使用此默认值存入数据库
HtmlTextAttribute: html 文本批注,表明此属性允许接受 html 风格的文本
LabelAttribute: label 批注,用于表单代码的自动生成
这个特性,请注意和ColumnAttribute之间的联系。ColumnAttribute里面也有一个Label的家伙。
LongTextAttribute:
长文本批注,标识此属性对应的数据列允许接受长文本字符串
MoneyAttribute:货币批注,可以保存货币类型数据。 此批注只能用在dotnet的decimal数据类型上。数据库存储的时候,使用的精度为:总位数19, 小数点后4位 这个特性是DecimalAttribute的一个特例,当然你也可以写为DecimalAttribute。
但是,日币等没有小数点的货币,可能不适合使用MoneyAttribute。
NotSaveAttribute: ORM在保存数据的时候,会忽略打上 NotSave 批注的属性
NotSerializeAttribute 在 json 序列化的时候,打上 NotSerialize 批注的属性会被忽略 在NET的序列化里面也有同样的【NotSerialize】特性,有这个特性的东西,不需要序列化。
AttributeUsage:
表名称批注,用于标识对象在数据库中对应的表名称 TinyIntAttribute:
小型整数批注,标识此属性对应的数据列为小型整数wojilu的很多地方都用到了反射,不过由于wojilu有完备的缓存系统,对于性能上的损失来说,可以忽略不计。
相关文章推荐
- wojilu系统的ORM代码解析-[源代码结构分析,ObjectBase基类分析]
- 开放源代码的全文检索引擎Lucene――介绍、系统结构与源码实现分析
- RPG游戏《黑暗之光》流程介绍与代码分析之(六):背包系统的实现(下)
- Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析
- java之反射--8.2.1分析类的结构--属性
- 以太网报文结构分析,与解析代码
- C#根据反射和特性实现ORM映射实例分析
- NSGA-2源代码分析(1)源代码结构
- FFmpeg源代码结构图 - 雷神经典代码分析
- unittest 源代码分析(一)--unittest代码结构分析
- opendaylight(Li) l2switch 源代码分析(1)--代码的整体结构和整体pom.xml
- PVFS2 源代码分析之用户系统接口src/client/sysin/sys-get-eattr.c状态机代码
- jquery源码解析:代码结构分析
- netlink监听网络变化代码(转载)+流程分析(原创+转载)+数据结构以及相关宏的解析(原创)
- 感受大师的代码风格_opencv源代码结构分析一
- android 属性系统代码分析
- C#根据反射和特性实现ORM映射实例分析
- MINA2 核心源代码分析笔记 - 1. 整体结构与代码分析指引
- mokid 工程代码下载与结构分析与两种机理的简单解析
- 抄google工程师的代码:通过读setting的源代码,利用反射机制调用系统隐藏的API