通过反射工厂实现多数据库间切换

本人电话:15004604582 QQ:771775671 若有不懂的地方欢迎询问

//面向接口编程:在实例化接口的时候通过工厂的方式实例化(工厂需是单独项目)

 1.IDAL.IUserInfo user = AbstractFactory.AbstractFactory.GetNewUserInfo();

//该类是工厂的类,每个数据层类(表)对应一个GetNew*方法

namespace Company.Project.AbstractFactory
{
    public static class AbstractFactory
    {   //获取要实例的数据层程序集名称
        private static readonly string dalAssemblyPath=ConfigurationManager.AppSettings["DalAssemblyPath"];
        //获取要实例的类公共命名空间名称
        private static readonly string dalNameSpace=ConfigurationManager.AppSettings["DalNameSpace"];
        //实例userinfo表
        public static IDAL.IUserInfo GetNewUserInfo()
        {
            string dalTotalNameSpace = dalNameSpace + ".UserInfo";
            return GetInstance(dalAssemblyPath, dalTotalNameSpace) as IDAL.IUserInfo;
        }
        private static object GetInstance(string assemblyName,string totalNameSpace)
        {
            //加载程序集
            if (DalCache.GetCache(totalNameSpace) == null)
            {
                Assembly ably = Assembly.Load(assemblyName);
                DalCache.SetCache(totalNameSpace, ably.CreateInstance(totalNameSpace));
            }
            return DalCache.GetCache(totalNameSpace);
        }
    }
}

//缓存类:使用缓存保存新实例,增加程序的可执行性

 public static class DalCache
    {
      //获取cache
      public static object GetCache(string key)
      {
          System.Web.Caching.Cache dataCache =System.Web.HttpRuntime.Cache;
          return dataCache["key"];
      }
      //设置cache
      public static void SetCache(string key,object value)
      {
          System.Web.Caching.Cache dataCache = System.Web.HttpRuntime.Cache;
          dataCache.Insert(key, value);
      }
    }

//xml中的数据:如果要切换数据库更改这里对应的程序集和对应的命名空间即可

<!--抽象工厂中要实例化的数据层程序集-->
    <add key="DalAssemblyPath" value="Company.Project.SQLDAL"/>
    <!--抽象工厂中要实例化的类的命名空间-->
    <add key="DalNameSpace" value="Company.Project.SQLDAL"/>

posted on 2013-12-06 13:46  无缘沙漠雨  阅读(160)  评论(0)    收藏  举报

导航