现在是做一个多帐套的进销存系统,每个帐套对应一个独立的数据库。
在实例化数据访问对象时,我是想每个帐套对应一个单例。 采用单例模式来构造数据访问对象,但一直觉得设计上有点缺陷,各位有这块经验的请多多指点阿。
我用了两个类,DBFactory和WorkItemCollection.
public class DBFactory
    {
        private static string _actName;//帐套名
        public DBFactory(string actName)
        {
            _actName = actName;
        }
        private static WorkItemCollection<Database> collection = new WorkItemCollection<Database>();
        private static object lockHelper = new object();
        public static Database Instance
        {
            get
            {
                var instance = collection.GetWorkItem(_actName);
                if (instance == null)
                {
                    lock (lockHelper)
                    {
                        if (instance == null)
                        { 
                            instance = new GenericDatabase("根据帐套获取到的连接字符串", SqlClientFactory.Instance);
                            collection.Add(instance);
                        }
                    }
                }
                return instance;
            }
        }
    }
    public class WorkItemCollection<T> where T : class
    {
        protected IList<T> items = new List<T>();
        /// <summary>
        /// 外部获得T类型的入口
        /// </summary>
        /// <returns></returns>
        public virtual T GetWorkItem(string actName)
        {
            if (items == null || items.Count == 0) return null;
            //可能的话返回一个现成实例
            foreach (T item in items)
            {
                return item;
            }
            return null;//如果没有现成的实例则返回null
        }
        /// <summary>
        /// 添加一个实例
        /// </summary>
        /// <param name="item"></param>
        public virtual void Add(T item)
        {
            if (item == null) throw new ArgumentNullException("item is null");
            items.Add(item);
        }
    }