天天看點

MVC+LINQToSQL的Repository模式之(一)資料工廠

namespace Data

{

    /// <summary>

    /// 資料庫建立工廠

    /// Created By : 張占嶺

    /// Created Date:2011-10-14

    /// Modify By:

    /// Modify Date:

    /// Modify Reason:

    /// </summary>

    internal static class DbFactory

    {

        static System.Timers.Timer sysTimer = new System.Timers.Timer(10000);

        volatile static Dictionary<Thread, DataContext[]> divDataContext = new Dictionary<Thread, DataContext[]>();

        static DbFactory()

        {

            sysTimer.AutoReset = true;

            sysTimer.Enabled = true;

            sysTimer.Elapsed += new System.Timers.ElapsedEventHandler(sysTimer_Elapsed);

            sysTimer.Start();

        }

        static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

            List<Thread> list = new List<Thread>();

            foreach (Thread item in divDataContext.Keys)

            {

                if (item.ThreadState == ThreadState.Stopped)

                {

                    list.Add(item);

                }

            }

            for (int index = 0; index < list.Count; index++)

                for (int refer = 0; refer < divDataContext[list[index]].Length; refer++)

                    if (divDataContext[list[index]][refer] != null)

                    {

                        divDataContext[list[index]][refer].Dispose();

                        divDataContext[list[index]][refer] = null;

                    }

                divDataContext.Remove(list[index]);

                list[index] = null;

            list = null;

        /// <summary>

        /// 通過工廠的制造模式擷取相應的LINQ資料庫連接配接對象

        /// </summary>

        /// <param name="dbName">資料庫名稱(需要與真實資料庫名稱保持一緻)</param>

        /// <returns>LINQ資料庫連接配接對象</returns>

        public static DataContext Intance(string dbName)

            return Intance(dbName, Thread.CurrentThread);

        /// <param name="thread">目前線程引用的對象</param>

        public static DataContext Intance(string dbName, Thread thread)

            if (!divDataContext.Keys.Contains(thread))

                divDataContext.Add(thread, new DataContext[2]);

            if (dbName.Equals("TEST"))

                if (divDataContext[thread][0] == null)

                    divDataContext[thread][0] = new Entity.TEST.LinqTESTDataContext();

                return divDataContext[thread][0];

            if (dbName.Equals("EEE114"))

                if (divDataContext[thread][1] == null)

                    divDataContext[thread][1] = new Entity.EEE114.LinqEEE114DataContext();

                return divDataContext[thread][1];

            else

                return null;

    }

}