public class DBProvider
    {
        private DBProvider()
        {  }        static DBProvider()
        {
            GetProvider();
        }        private static IDataProvider _instance = null;
        private static object lockHelper = new object();
    
        private static void GetProvider()
        {
            try
            {
                _instance = (IDataProvider)Activator.CreateInstance(Type.GetType(string.Format("cq.Fdc.Data.SqlServer.DataProvider,cq.Fdc.Data.SqlServer"), false, true));
            }
            catch(Exception ex)
            {
                throw new Exception("实现接口时出现异常!!!"+ex.ToString());
            }
        }
        
        /// <summary>
        /// 返回接口对象
        /// </summary>
        /// <returns></returns>
        public static IDataProvider GetInstance()
        {
            if (_instance == null)
            {
                lock (lockHelper)
                {
                    if (_instance == null)
                    {
                        GetProvider();
                    }
                }
            }
            return _instance;
        }
    }
这个是程序中构建数据库访问对象时候的代码。这里用到的单键模式,是否会对访问造成影响???如果去掉会有什么后果?

解决方案 »

  1.   

    如果你不是为了模仿什么模式上的代码的话,而是从实用的话,实际上不需要声明什么独立的class。你的程序中会有很多公共函数,那么创建一个函数库,例如public static class Common
    {
      private static IDataProvider _instance;  public static IDataProvider GetProviderInstance()
      {
        if(_instance==null)
        {
            _instance=(IDataProvider)Activator.CreateInstance.......;
        }
        return _instance;
    }....... 以及其它几十、上百个公共函数方法
    }
    这就行了。
      

  2.   

    没有必要声明class的时候,别在形式上太过臃肿。
      

  3.   

    DAL与具体的数据库操作分开
    在dal中声明一个属性来包装DbTransaction,
    bll中得到.用事务的方法传同一个DbTransaction
    public interface IDataBase<T>
        { 
            int GetMaxId(); 
            bool Exists(string primaryKeyId); 
            void Add(T t); 
            void Update(T t); 
      }
     看看微软企业库
      

  4.   


    这与这个就看不出来了。不知道你的
    string.Format("cq.Fdc.Data.SqlServer.DataProvider,cq.Fdc.Data.SqlServer")
    中的cq.Fdc.Data.SqlServer具体内容是什么,就不能看出“是否构成影响”。
      

  5.   

    cq.Fdc.Data.SqlServer 中 是数据访问层的命名空间比如 有个叫AgentManage的类,写法如下
    namespace cq.Fdc.Data.SqlServer
    {
     public partial class DataProvider : IDataProvider
        {
            方法。。
        }
    }