zoukankan      html  css  js  c++  java
  • 轻量级ORM开发系列:缓存类信息以及配置文件的处理

    内部信息缓存

      在轻量级ORM内部,会产生大量的与类相关的信息,在前面的博文里面,我已经记录了如何来存储这些信息,具体请见轻量级ORM开发系列:Model类相关信息的处理一文。这些相关的信息都是在ORM第一个请求的时候根据配置文件所配置的程序集来进行反射得到的,所以在第一个请求的时候花费的时间会比较长,这里我记录我所设计的一个缓存,能够很好的解决这个问题。

      为了能够返回强类型的结果,我这里使用Dictionary作为内部存储结构而不是Hashtable,当然我知道很多成熟的ORM都是使用的Hashtable,不过我只是做一个轻量级的学习型开发,简单就好。这里的返回结果采用IDictionary接口进行返回。

      具体代码如下:

    代码
     public static class EntityList
        {
            
    private static IDictionary<string, EntityInfo> StaticDic = null;

            
    static EntityList()
            {
                StaticDic 
    = new Dictionary<string, EntityInfo>();
            }
            
    public static void InsertEntityInfo(string type,EntityInfo Info)
            {
                
    if (StaticDic.ContainsKey(type))
                {
                    
    return;
                }
                
    else 
                {
                    StaticDic.Add(type,Info);
                }
            }
            
    public static IDictionary<string, EntityInfo> GetDic()
            {
                
    return StaticDic;
            }

            
    public static void InsertEntityInfo( EntityInfo Info)
            {
                InsertEntityInfo(Info.TypeFullName, Info);
            }
            
    public static bool IsContain(string name)
            {
                
    return StaticDic.ContainsKey(name);
            }

            
    public static void InsertEntityInfo(IEntity entity, EntityInfo Info)
            {
                
    string type = entity.GetType().FullName;
                InsertEntityInfo(type,Info);
            }

            
    public static EntityInfo GetEntityInfo(string type)
            {
                
    if (StaticDic.ContainsKey(type))
                {
                    
    return StaticDic[type];
                }
                
    else
                {
                    
    return null;
                }
            }
            
    public static EntityInfo GetEntityInfo(IEntity entity)
            {
                
    string type = entity.GetType().FullName;
                
    return GetEntityInfo(type);
            }

            
    public static EntityInfo GetEntityInfo<T>() where T:IEntity
            {
                
    string type = typeof(T).FullName;
                
    return GetEntityInfo(type);
            }
        }

      如果你需要的Model类对应的信息不在这个缓存里面怎么办,我们需要对其开发一个访问门户,由他来判断决定这些事情

    代码
     public static EntityInfo Get(Type t)
            {
                EntityInfo myentity 
    = EntityList.GetEntityInfo(t.FullName);
                
    if (myentity == null)
                {
                   myentity
    = EntityInfoHandler.LoadEntityInfo(t);
                   
    if (myentity == null)
                   {
                       
    throw new DeveloperException(t.FullName+" has a problem,the fox orm can't load it,you must check if this class has a TableAttribute ");
                   }
                }
                
    return myentity;
            }


    查询数据缓存

      提到ORM就不能不提hibernate, 分析hibernate源代码你可以发现,他有两级缓存,session level 和SessionFactory level 缓存,我这里为了开发学习,准备开发的只有一个类似session level 的一级缓存。

     配置文件信息

            作为一个ORM ,那么他就不可避免的有许多相关的配置信息,例如我们的连接字符串,表前缀,数据库访问提供者信息,Model程序集的相关信息等等

            这里我们的配置信息类直接继承自ConfigBase<T>模型,具体实现请查看  抛弃ConfigurationManager , 实现面向对象读写配置文件  一文。

    代码
    [Serializable]
        
    public class ORMConfig : Fox.Config.ConfigBase<ORMConfig>
        {
            
    private static ORMConfig _Instance = LoadConfig();

            [XmlIgnore]
            
    public static ORMConfig Instance
            {
                
    get { return _Instance; }
            }

            
    public static ORMConfig LoadConfig()
            {
                
    return new ORMConfig().Load();
            }


            
    public string Connection { getset; }
            
    public string DataPre { getset; }
            
    public string Provider { getset; }
            
    public string AssemblyInfo { getset; }
            
    public string DefaultDBName { getset; }

            [XmlIgnore]
            
    public string[] AssemblyInfoList
            {
                
    get
                {
                    
    if (StringHandler.HasValue(AssemblyInfo))
                    {
                        
    if (AssemblyInfo.Contains(","))
                        {
                            
    string[] myarray = AssemblyInfo.Split(',');
                            
    return myarray;
                        }
                        
    else if (AssemblyInfo.Contains(""))
                        {
                            
    string[] myarray = AssemblyInfo.Split('');
                            
    return myarray;
                        }
                        
    else
                        {
                            
    string[] mystrarray=new string[1];
                            mystrarray[
    0]=AssemblyInfo;
                            
    return mystrarray;
                        }
                    }
                    
    else
                        
    return null;
                }
            }
        }

          其中Instance实现一个单例模式,至于他头上的[XmlIgnore]的用处,是一个序列化忽略标记。

         下面来详细介绍一下他的成员属性

            public string Connection { get; set; }            //连接字符串
            public string DataPre { get; set; }                  //数据库表前缀
            public string Provider { get; set; }                  //数据库的提供者,通过反射获得实例,实现兼容多数据库
            public string AssemblyInfo { get; set; }         //Model程序集字符串,加载类的属性信息时将会用到,若Model分布在多个程序集,则用逗号分开
            public string DefaultDBName { get; set; }    //默认的数据库名

            public string[] AssemblyInfoList   这个属性访问器实现分割多个程序集的字符串。

         这个类协调整个ORM,如果需要用到这个ORM的地方,那么这个类一定会是一个关注点,因为它包含了项目特定的一些东西,是非常重要的一个信息类。


    博客地址:Zealot Yin

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

  • 相关阅读:
    C#函数式编程
    三种观察者模式的C#实现
    使用C#设计Fluent Interface
    02.Python网络爬虫第二弹《http和https协议》
    03.Python网络爬虫第一弹《Python网络爬虫相关基础概念》
    第七章:Python基础のXML操作和面向对象(一)
    第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
    第六章:Python基础の反射与常用模块解密
    第四章:Python基础の快速认识內置函数和操作实战
    第三章:Python基础の函数和文件操作实战
  • 原文地址:https://www.cnblogs.com/Creator/p/1888397.html
Copyright © 2011-2022 走看看