当你使用LINQ做底层时,最好设计一个工厂,不要把LINQ的动作暴露给业务层

Posted 山涧清泉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当你使用LINQ做底层时,最好设计一个工厂,不要把LINQ的动作暴露给业务层相关的知识,希望对你有一定的参考价值。

 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的动作暴露给业务层的主要内容,如果未能解决你的问题,请参考以下文章

两种设计模式==>>“简单工厂”

设计模式1抽象工厂模式

设计模式-工厂模式简单理解

《Head First 设计模式》之工厂模式

C# 窗体上有图片,把窗体的按钮放在底层怎么做?

当你在做SAAS产品时,这些坑你需要了解