wojilu系统的ORM代码解析-[源代码结构分析,用特性和反射来感知属性-特性介绍篇]
我们知道,ORM最主要的功能是自动化,如何更具类的属性来自动生成对应的数据表,这个是ORM的一个研究重点。wojilu的实现方法是在属性上增加特性attr,通过运行时的反射Reflection来感知属性的特性,决定数据映射的策略。
本文里面的【批注】一词出于源代码,和特性是指同一个意思。我本人比较喜欢说【特性】。
打开wojilu源代码,wojilu/orm/attribute 里面有很多特性的类,wojilu就是通过他们来知道类里面的属性,希望怎么映射为数据库里面的字段。
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
10 public ColumnAttribute() {
11 _length = 250;
12 }
13
14 public String Name {
15 get {
16 return _columnName;
17 }
18 set {
19 _columnName = value;
20 }
21 }
22
23 public String Label {
24 get {
25 return _label;
26 }
27 set {
28 _label = value;
29 }
30 }
31
32 public int Length {
33 get {
34 return _length;
35 }
36 set {
37 _length = value;
38 }
39 }
40
41 public Boolean LengthSetted() {
42 return _length > 0 && _length != 250;
43 }
这里表示一个字段在数据库里面的列的信息,LABEL和NAME的不同之处在于,LABEL是在提交表单的时候,使用的名称,NAME是在数据库里面使用的名称。这里的LengthSetted其实是有问题的,如果Length大于0,这个条件没有问题,length不等于250是有BUG的。这里正确的做法是设置一个Flg进行判断,在Length属性的Set的时候将Flg设定为True,然后LengthSetted返回这个Flg就可以了。250这个不是MagicNumber,很有可能别人设定的长度就是250。
2 /// 用于自定义精度数据,也可以存储自定义精度的货币数值。
3 /// </summary>
4 [Serializable, AttributeUsage( AttributeTargets.Property )]
5 public class DecimalAttribute : Attribute {
6
7 /// <summary>
8 /// 数值的精度,即小数点左右的总共位数,但不包括小数点。
9 /// </summary>
10 public int Precision { get; set; }
11
12 /// <summary>
13 /// 小数点右侧的位数
14 /// </summary>
15 public int Scale { get; set; }
不过,这里没有进行安全检查,例如小数位数不可以超过整数位数。如果要做的完美的话,应该有一个检查的。特性的时候,异常处理的方法,我不是很清楚,难道在写代码的时候,Enter按下后,出现红色错误下划线?
默认值批注,当属性没有被赋值的时候,系统使用此默认值存入数据库
html 文本批注,表明此属性允许接受 html 风格的文本
label 批注,用于表单代码的自动生成
这个特性,请注意和ColumnAttribute之间的联系。ColumnAttribute里面也有一个Label的家伙。LongTextAttribute:
长文本批注,标识此属性对应的数据列允许接受长文本字符串
这个特性是DecimalAttribute的一个特例,当然你也可以写为DecimalAttribute。
但是,日币等没有小数点的货币,可能不适合使用MoneyAttribute。
ORM在保存数据的时候,会忽略打上 NotSave 批注的属性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架