• 轻量级ORM开发系列:Attribute准备


         此系列文章记录我开发ORM的过程。

         开篇:Attribute准备

         我们需要利用Attribute来完成某些信息的配置,在nhibernate中我们使用的是XML文件来配置主键,字段映射,实体之间的关系,级联操作等等关系。这也带来了许多的问题,大部分的使用nhibernate开发的人员都会抱怨XML文件的管理,以及编写问题。笔者实践的这个ORM为了更好的提高用户体验,决定舍弃XML配置关系信息的方式,所有的相关信息都使用Attribute来实现。例如:

    public class student{

     string name;

     string child_name;

    }

     一个学生类,包含两个信息。姓名以及小时候的名字,如果我们的业务逻辑需要,把所有学生小时候的名字同意显示为 “小+name"  那么我们就根本不需要开辟child_name属性到数据库,自然也就不需要保存了。这是使用Attribute来实现这一功能我们可以这样写:

     [Ignore]

     string child_name;

     当然首先我们需要实现这些Attribute。

    既然上面已经提到了这个  [Ignore] 那么我们就来先实现它吧。

    [Serializable, AttributeUsage(AttributeTargets.Property)]
        
    public class IgnoreAttribute : Attribute
        {
        }

     看出个究竟来了没有?为什么类里面是空的?这样做的意义是什么?

    这里的 IgnoreAttribute仅仅只是起到一个标识作用,这就相当于一个bool类型的属性,它只有两种可能,不是true就是false,这也是同样的道理,用定义了 [Ignore]与没有定义 [Ignore]来模拟true和false。[Serializable]标识该类能够被序列化,方便以文件的方式持久保存。AttributeUsage(AttributeTargets.Property)表示[Ignore]这个Attribute只能用于属性,不能用于方法或类。强制定义它的使用范围。

    本文既然是 Attribute准备 ,那么我们就要一次性实现所有的Attribute。

    ColumnAttribute
    [AttributeUsage(AttributeTargets.Property)]
        
    public sealed class ColumnAttribute : Attribute
        {
            
    private string _column;
            
    private DataType dataType;
            
    private int length=255;
            
    private bool canNull=true;
            
    private object defaultValue;
            
    private bool autoIncrement = false;
            
    private bool isUnique=false;

            
    public ColumnAttribute()
            {
            }
            
    public ColumnAttribute(string paraColumn,DataType dataType)
            {
                
    this._column = paraColumn;
                
    this.dataType = dataType;
            }
            
    public ColumnAttribute(string paraColumn,DataType dataType,int length,bool canNull,object defaultValue,bool autoIncrement,bool isUnique)
            {
                
    this._column = paraColumn;
                
    this.dataType = dataType;
                
    this.length = length;
                
    this.canNull = canNull;
                
    this.defaultValue = defaultValue;
                
    this.autoIncrement = autoIncrement;
                
    this.isUnique = isUnique;
            }



            
    /// <summary>
            
    /// 表字段的数据类型
            
    /// </summary>
            public DataType DataType
            {
                
    get { return dataType; }
                
    set { dataType = value; }
            }
            
    /// <summary>
            
    /// 数据库中的列
            
    /// </summary>
            public string Column
            {
                
    get { return _column; }
                
    set { _column = value; }
            }

            
    /// <summary>
            
    /// 表字段的长度
            
    /// </summary>
            public int Length
            {
                
    get { return length; }
                
    set { length = value; }
            }

            
    /// <summary>
            
    /// 表字段是否可以为空
            
    /// </summary>
            public bool CanNull
            {
                
    get { return canNull; }
                
    set { canNull = value; }
            }

            
    /// <summary>
            
    /// 表字段的默认值
            
    /// </summary>
            public object DefaultValue
            {
                
    get { return defaultValue; }
                
    set { defaultValue = value; }
            }
            
    /// <summary>
            
    /// 表字段是否为自动增长列
            
    /// </summary>
            public bool AutoIncrement
            {
                
    get { return autoIncrement; }
                
    set { autoIncrement = value; }
            }
            
    /// <summary>
            
    /// 确定某个字段是否唯一
            
    /// </summary>
            public bool IsUnique
            {
                
    get { return isUnique; }
                
    set { isUnique = value; }
            }
        }
    RelationAttribute
     [AttributeUsage(AttributeTargets.Property)]
        
    public class RelationAttribute:Attribute
        {
            
    public RelationAttribute()
            {
            }
            
    public RelationAttribute(Cascade paracascade,Relation pararelation)
            {
                _cascade 
    = paracascade;
                _relation 
    = pararelation;
            }
            
    private Cascade _cascade = Cascade.None;
            
    private Relation _relation = Relation.None;
            
    /// <summary>
            
    /// 表之间的关系
            
    /// </summary>
            public Relation Relation
            {
                
    get { return _relation; }
                
    set { _relation = value; }
            }
            
    /// <summary>
            
    /// 级联操作
            
    /// </summary>
            public Cascade Cascade
            {
                
    get { return _cascade; }
                
    set { _cascade = value; }
            }

        }
    TableAttribute
     [AttributeUsage( AttributeTargets.Class )]
        
    public sealed class TableAttribute:Attribute
        {
            
    private string _PrimaryKey;
            
    private string name;
            
    private string version = "V1.0";
            
    /// <summary>
            
    /// 无参数构造方法
            
    /// </summary>
            public TableAttribute()
            {

            }
            
    public TableAttribute(string name) 
            {
                
    this._PrimaryKey ="ID";
                
    this.name = name;
            }
            
    public TableAttribute(string name,string version, string DataBaseName)
            {
                
    this._PrimaryKey = "ID";
                
    this.name = name;
                
    this.version = version;
            }

            
    /// <summary>
            
    /// 数据表名
            
    /// </summary>
            public string Name
            {
                
    get { return name; }
                
    set { name = value; }
            }
            
    public string DataBaseName { getset; }
            
    /// <summary>
            
    /// 表实体版本号
            
    /// 默认为 "V1.0"
            
    /// </summary>
            public string Version
            {
                
    get { return version; }
                
    set { version = value; }
            }
            
    /// <summary>
            
    /// 表字段是否为主键
            
    /// </summary>
            public string PrimaryKey
            {
                
    get { return _PrimaryKey; }
                
    set { _PrimaryKey = value; }
            }
        }

    以及上面已经提供的IgnoreAttribute一起。这四个Attribute将完成所有的配置信息关系的表示。

    这里有必要进行一些简单的介绍

     ColumnAttribute : 定义每一列的相关信息(包括表字段的数据类型,数据库中的列名,表字段的长度,表字段是否可以为空,表字段的默认值等等信息,具体有哪些请参见这个类的注释。

     RelationAttribute: 定义每一列与其他Model的关系,包括many2many,many2one等关系,再后面的文章中将会一一讲述。

     TableAttribute    :  定义每个类所对应的表名,主键等信息。

     好了,今天就到这里,请听下回分解。


    博客地址:Zealot Yin

    欢迎转载,转载请注明出处[http://creator.cnblogs.com/]

  • 相关阅读:
    4、现有的命名方式有多少种?请举例说明。
    第二次作业
    第一次作业
    RateLimiter源码
    使用ASM字节码框架实现动态代理
    Java流机制学习
    Java8 Stream 学习总结
    XML实体解析器的作用
    DefaultResouceLoader的设计
    RSA 非对称加密 数字签名 数字证书
  • 原文地址:https://www.cnblogs.com/Creator/p/1861808.html
Copyright © 2020-2023  润新知