1. 程式人生 > >當你使用LINQ做底層時,最好設計一個工廠,不要把LINQ的動作暴露給業務層

當你使用LINQ做底層時,最好設計一個工廠,不要把LINQ的動作暴露給業務層

handle ram tile div ++ space ner 數據庫名 string

 1: using System;
  2: using System.Collections.Generic;
  3: using System.Linq;
  4: using System.Text;
  5: using System.Data.Linq;
  6: using System.Threading;
  7: 
  8: namespace Data
  9: {
 10:     /// <summary>
 11:     /// LINQ數據庫連接對象制造工廠
 12:     /// </summary>
 13:     static internal class DataContextFactory
 14:     {
 15: 
 16:         static System.Timers.Timer sysTimer = new System.Timers.Timer(10000);
 17: 
 18:         volatile static Dictionary<Thread, DataContext[]> divDataContext = new Dictionary<Thread, DataContext[]>();
 19: 
 20:         static public int DataContextCount { get { return divDataContext.Count; } }
 21: 
 22:         static DataContextFactory()
 23:         {
 24:             sysTimer.AutoReset = true;
 25:             sysTimer.Enabled = true;
 26:             sysTimer.Elapsed += new System.Timers.ElapsedEventHandler(sysTimer_Elapsed);
 27:             sysTimer.Start();
 28:         }
 29: 
 30:         static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 31:         {
 32:             List<Thread> list = new List<Thread>();
 33:             foreach (Thread item in divDataContext.Keys)
 34:             {
 35:                 if (item.ThreadState == ThreadState.Stopped)
 36:                 {
 37:                     list.Add(item);
 38:                 }
 39:             }
 40:             for (int index = 0; index < list.Count; index++)
 41:             {
 42:                 divDataContext.Remove(list[index]);
 43:                 list[index] = null;
 44:             }
 45:             list = null;
 46:         }
 47: 
 48:         /// <summary>
 49:         /// 通過工廠的制造模式獲取相應的LINQ數據庫連接對象
 50:         /// </summary>
 51:         /// <param name="dbName">數據庫名稱(需要與真實數據庫名稱保持一致)</param>
 52:         /// <returns>LINQ數據庫連接對象</returns>
 53:         public static DataContext Intance(string dbName)
 54:         {
 55:             return Intance(dbName, Thread.CurrentThread);
 56:         }
 57:         /// <summary>
 58:         /// 通過工廠的制造模式獲取相應的LINQ數據庫連接對象
 59:         /// </summary>
 60:         /// <param name="dbName">數據庫名稱(需要與真實數據庫名稱保持一致)</param>
 61:         /// <param name="thread">當前線程引用的對象</param>
 62:         /// <returns>LINQ數據庫連接對象</returns>
 63:         public static DataContext Intance(string dbName, Thread thread)
 64:         {
 65:             if (!divDataContext.Keys.Contains(thread))
 66:             {
 67:                 divDataContext.Add(thread, new DataContext[4]);
 68:             }
 69:             if (dbName.Equals("zzl"))
 70:             {
 71:                 if (divDataContext[thread][0] == null)
 72:                 {
 73:                     divDataContext[thread][0] = new Data.LinqzzlDataContext();
 74:                 }
 75:                 return divDataContext[thread][0];
 76:             }
 77:             else
 78:             {
 79:                 return null;
 80:             }
 81:         }
 82: 
 83:  
 84: 
 85:     }
 86: }
 87: 

當你使用LINQ做底層時,最好設計一個工廠,不要把LINQ的動作暴露給業務層