• wojilu系统的ORM代码解析[源代码结构分析,用特性和反射来感知属性特性介绍篇]


          我们知道,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 
    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。

    DatabaseAttribute:数据库批注 这里只是设定了数据库的名称
    DecimalAttribute:用于自定义精度数据,也可以存储自定义精度的货币数值。
    这个是解决浮点数的特性,通过这个特性,我们可以自定义数字在数据库里面的精度
     1     /// <summary>
     2     /// 用于自定义精度数据,也可以存储自定义精度的货币数值。
     3     /// </summary>
     4     [Serializable, AttributeUsage( AttributeTargets.Property )]
     5     public class DecimalAttribute : Attribute {
     6 
     7         /// <summary>
     8         /// 数值的精度,即小数点左右的总共位数,但不包括小数点。
     9         /// </summary>
    10         public int Precision { getset; }
    11 
    12         /// <summary>
    13         /// 小数点右侧的位数
    14         /// </summary>
    15         public int Scale { getset; }

     不过,这里没有进行安全检查,例如小数位数不可以超过整数位数。如果要做的完美的话,应该有一个检查的。特性的时候,异常处理的方法,我不是很清楚,难道在写代码的时候,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有完备的缓存系统,对于性能上的损失来说,可以忽略不计。
  • 相关阅读:
    Java基本语法--程序流程控制
    Java基本语法--控制台输入(Scanner类)
    Java基本语法--运算符
    curl:出现SSL错误提示
    升级ruby的版本
    Linux之expect非交互式功能
    Rsync备份同步数据工具
    Linux发展历史
    解决DDOS攻击生产案例
    用shell脚本监控MySQL主从同步
  • 原文地址:https://www.cnblogs.com/TextEditor/p/2091255.html
Copyright © 2020-2023  润新知