自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

線程共享的DbContext與私有的DbContext

開發(fā) 架構(gòu)
在使用Linq to Sql做為底層ORM時,它為我們提供的數(shù)據(jù)上下文為DataContext對象,實現(xiàn)上我們通過拖動生成的DBML文件,它們都是繼承自 System.Data.Linq.DataContext類型的,所以DataContext就是LINQ數(shù)據(jù)對象的基類,有時,我們可以通過這種類的多態(tài)性來動態(tài)創(chuàng)建DB的實例。

在使用Linq to Sql做為底層ORM時,它為我們提供的數(shù)據(jù)上下文為DataContext對象,實現(xiàn)上我們通過拖動生成的DBML文件,它們都是繼承自 System.Data.Linq.DataContext類型的,所以DataContext就是LINQ數(shù)據(jù)對象的基類,有時,我們可以通過這種類的多態(tài)性來動態(tài)創(chuàng)建DB的實例。

在每個DataContext類中,它有幾個實例的構(gòu)造方法,用來讓你創(chuàng)建DataContext的實例,如下:

  1. /// <summary>  
  2.          /// 使用默認(rèn)的連接串創(chuàng)建實現(xiàn)(每拖一次數(shù)據(jù)庫,就會產(chǎn)生一個連接串)  
  3.          /// </summary>  
  4.          public DataClasses1DataContext() :   
  5.                  base(global::test.Properties.Settings.Default.EEE114ConnectionString, mappingSource)  
  6.          {  
  7.              OnCreated();  
  8.          }  
  9.          /// <summary>  
  10.          /// 使用指定的連接串,可能配置在config文件里  
  11.          /// </summary>  
  12.          /// <param name="connection"></param>  
  13.          public DataClasses1DataContext(string connection) :   
  14.                  base(connection, mappingSource)  
  15.          {  
  16.              OnCreated();  
  17.          }  
  18.          /// <summary>  
  19.          /// 使用使用了IDbConnection接口的對象創(chuàng)建實例  
  20.          /// </summary>  
  21.          /// <param name="connection"></param>  
  22.          public DataClasses1DataContext(System.Data.IDbConnection connection) :   
  23.                  base(connection, mappingSource)  
  24.          {  
  25.              OnCreated();  
  26.          }  
  27.          /// <summary>  
  28.          /// 使用連接串和數(shù)據(jù)庫的映射文件來建立實例,mappingSource可能是一個XML文件  
  29.          /// </summary>  
  30.          /// <param name="connection"></param>  
  31.          /// <param name="mappingSource"></param>  
  32.          public DataClasses1DataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) :   
  33.                  base(connection, mappingSource)  
  34.          {  
  35.              OnCreated();  
  36.          } 

而我們在實現(xiàn)項目開發(fā)中,可能用第二種比較多,即

  1. DataClasses1DataContext db=new LINQ.DataClasses1DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["XXB"].ToString()) 

這樣,在開發(fā)環(huán)境與生成環(huán)境只要配置一個CONFIG文件即可。靈活。

而今天的主題是線程共享的DbContext與私有的DbContext,所以開始書歸正轉(zhuǎn)了,對于ado.net架構(gòu)中,我們往往使用一個static全局對象來完成數(shù)據(jù)訪問工作,而在linq to sql中,如果你建立一個static對象,它會出現(xiàn)很多問題,這在實現(xiàn)開發(fā)過程中才可以體會到,所以,今天要說的不是static對象。

一 線程共享的DbContext,說清楚一點就是在一個線程內(nèi),你的DataContext對象是共享的,是一個對象,不是new出很多個datacontext對象來,這事實上是一種單例模式的體現(xiàn),這沒有問題,它解決了static對象所產(chǎn)生的問題,而又滿足了多表關(guān)聯(lián)查詢時出現(xiàn)(不能實現(xiàn)不同數(shù)據(jù)上下文件的引用,linq to sql和Ef都是這樣的)的問題。

代碼:

datacontext生成工廠:

  1. /// <summary>  
  2.      /// 數(shù)據(jù)庫建立工廠  
  3.      /// Created By : 張占嶺  
  4.      /// Created Date:2011-10-14  
  5.      /// Modify By:  
  6.      /// Modify Date:  
  7.      /// Modify Reason:  
  8.      /// </summary>  
  9.      internal sealed class DbFactory  
  10.      {  
  11.          #region Fields  
  12.          static System.Timers.Timer sysTimer = new System.Timers.Timer(10000);  
  13.          volatile static Dictionary<Thread, DbContext[]> divDataContext = new Dictionary<Thread, DbContext[]>();  
  14.          #endregion  
  15.    
  16.          #region Constructors  
  17.          /// <summary>  
  18.          /// 類構(gòu)造方法  
  19.          /// </summary>  
  20.          static DbFactory()  
  21.          {  
  22.              sysTimer.AutoReset = true;  
  23.              sysTimer.Enabled = true;  
  24.              sysTimer.Elapsed += new System.Timers.ElapsedEventHandler(sysTimer_Elapsed);  
  25.              sysTimer.Start();  
  26.          }  
  27.          #endregion  
  28.    
  29.          #region  Static Methods  
  30.    
  31.          /// <summary>  
  32.          /// 訂閱Elapsed事件的方法  
  33.          /// </summary>  
  34.          /// <param name="sender"></param>  
  35.          /// <param name="e"></param>  
  36.          static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  37.          {  
  38.              List<Thread> list = divDataContext.Keys.Where(item => item.ThreadState == ThreadState.Stopped).ToList();  
  39.              for (int index = 0; index < list.Count; index++)  
  40.              {  
  41.                  for (int refer = 0; refer < divDataContext[list[index]].Length; refer++)  
  42.                      if (divDataContext[list[index]][refer] != null)  
  43.                      {  
  44.                          divDataContext[list[index]][refer].Dispose();  
  45.                          divDataContext[list[index]][refer] = null;  
  46.                      }  
  47.                  divDataContext.Remove(list[index]);  
  48.                  list[index] = null;  
  49.              }  
  50.          }  
  51.          /// <summary>  
  52.          /// 通過工廠的制造模式獲取相應(yīng)的LINQ數(shù)據(jù)庫連接對象  
  53.          /// </summary>  
  54.          /// <param name="dbName">數(shù)據(jù)庫名稱(需要與真實數(shù)據(jù)庫名稱保持一致)</param>  
  55.          /// <returns>LINQ數(shù)據(jù)庫連接對象</returns>  
  56.          public static DbContext Intance(string dbName)  
  57.          {  
  58.              return Intance(dbName, Thread.CurrentThread, 10);  
  59.          }  
  60.    
  61.          /// <summary>  
  62.          /// 通過工廠的制造模式獲取相應(yīng)的LINQ數(shù)據(jù)庫連接對象  
  63.          /// </summary>  
  64.          /// <param name="dbName"></param>  
  65.          /// <param name="dbCount"></param>  
  66.          /// <param name="dbIndex"></param>  
  67.          /// <returns></returns>  
  68.          public static DbContext Intance(string dbName, int dbCount, int dbIndex)  
  69.          {  
  70.              return Intance(dbName, Thread.CurrentThread, dbCount, dbIndex);  
  71.          }  
  72.    
  73.          /// <summary>  
  74.          /// 通過工廠的制造模式獲取相應(yīng)的LINQ數(shù)據(jù)庫連接對象  
  75.          /// </summary>  
  76.          /// <param name="dbName">數(shù)據(jù)庫名稱(需要與真實數(shù)據(jù)庫名稱保持一致)</param>  
  77.          /// <param name="thread">當(dāng)前線程引用的對象</param>  
  78.          /// <param name="dbCount">linq to sql數(shù)據(jù)庫數(shù)量</param>  
  79.          /// <param name="dbIndex">當(dāng)前索引</param>  
  80.          /// <returns>LINQ對象上下文</returns>  
  81.          public static DbContext Intance(string dbName, Thread thread, int dbCount, int dbIndex)  
  82.          {  
  83.              if (!divDataContext.Keys.Contains(thread))  
  84.              {  
  85.                  divDataContext.Add(thread, new DbContext[dbCount]);  
  86.              }  
  87.              if (divDataContext[thread][dbIndex] == null)  
  88.              {  
  89.                  divDataContext[thread][dbIndex] = new DbContext(dbName);  
  90.              }  
  91.              return divDataContext[thread][dbIndex];  
  92.          }  
  93.    
  94.          /// <summary>  
  95.          /// 通過工廠的制造模式獲取相應(yīng)的LINQ數(shù)據(jù)庫連接對象  
  96.          /// </summary>  
  97.          /// <param name="dbName"></param>  
  98.          /// <param name="thread"></param>  
  99.          /// <returns></returns>  
  100.          public static DbContext Intance(string dbName, Thread thread)  
  101.          {  
  102.              return Intance(dbName, thread, 10);  
  103.          }  
  104.          #endregion  
  105.    
  106.      } 

具體領(lǐng)域數(shù)據(jù)對象創(chuàng)建時代碼如下:

  1. /// <summary>  
  2.      /// XXB數(shù)據(jù)庫基類  
  3.      /// </summary>  
  4.      public class XXB_DataBase : DataBase  
  5.      {  
  6.          private readonly static string _conn;  
  7.          static XXB_DataBase()  
  8.          {  
  9.              if (ConfigurationManager.ConnectionStrings["XXB"] == null)  
  10.                  throw new Exception("請設(shè)置XXB配置字符");  
  11.              else 
  12.                  _conn = ConfigurationManager.ConnectionStrings["XXB"].ToString();  
  13.          }  
  14.          public XXB_DataBase()  
  15.              : base(DbFactory.Intance(_conn, 21))  
  16.          { }  
  17.    
  18.      } 

二 私有的DbContext,它要求你為每個表都建立一個repository對象,用戶對表進(jìn)行CURD操作,而它們都繼承一個database,在 database里有唯一創(chuàng)建datacontext的入口,這樣在做多表關(guān)聯(lián)時,使用的是同一個datacontext對象,所以不會出現(xiàn)“不能實現(xiàn)不同數(shù)據(jù)上下文件的引用”這種問題,但這樣方式感覺很不爽,因為你必須把所有多表關(guān)聯(lián)的業(yè)務(wù)邏輯,寫在DAL層,這是很郁悶的,因為一般我們會把它放在BLL層(更有利于業(yè)務(wù)的組合與重用)。

代碼:

具體領(lǐng)域數(shù)據(jù)基類:

  1. /// <summary>  
  2.      /// XXB數(shù)據(jù)基類  
  3.      /// </summary>  
  4.      public abstract class XXBBase : DataBase  
  5.      {  
  6.          public XXBBase()  
  7.              : base(new LINQ.DataClasses1DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["XXB"].ToString()))  
  8.          { }  
  9.      } 

統(tǒng)一數(shù)據(jù)基類:

  1. /// <summary>  
  2.      /// 標(biāo)準(zhǔn)數(shù)據(jù)操作基類  
  3.      /// </summary>  
  4.      public abstract class DataBase : IRepository  
  5.      {  
  6.          /// <summary>  
  7.          /// 數(shù)據(jù)訪問對象(只對子類可見)  
  8.          /// </summary>  
  9.          protected DataContext DB;  
  10.    
  11.          #region Constructors  
  12.          public DataBase(DataContext db)  
  13.              : this(() => { return db; })  
  14.          { }  
  15.          public DataBase(Func<DataContext> func)  
  16.          {  
  17.              this.DB = func();  
  18.          }  
  19.          #endregion  
  20.    
  21.          #region DBContext SubmitChanges  
  22.          /// <summary>  
  23.          /// XXB默認(rèn)提交【重寫時候可能需要寫入自定義的類似約束的邏輯】  
  24.          /// </summary>  
  25.          protected virtual void SubmitChanges()  
  26.          {  
  27.              ChangeSet cSet = DB.GetChangeSet();  
  28.              if (cSet.Inserts.Count > 0 
  29.                  || cSet.Updates.Count > 0 
  30.                  || cSet.Deletes.Count > 0)  
  31.              {  
  32.                  try 
  33.                  {  
  34.                      DB.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);  
  35.                  }  
  36.                  catch (System.Data.Linq.ChangeConflictException)  
  37.                  {  
  38.                      foreach (System.Data.Linq.ObjectChangeConflict occ in DB.ChangeConflicts)  
  39.                      {  
  40.                          occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);  
  41.                          occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);  
  42.                          occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);  
  43.                      }  
  44.                      DB.SubmitChanges();  
  45.                  }  
  46.              }  
  47.          }  
  48.    
  49.          #endregion  
  50.    
  51.          #region IRepository 成員  
  52.    
  53.          public virtual void Update<TEntity>(TEntity entity) where TEntity : class 
  54.          {  
  55.              this.SubmitChanges();  
  56.    
  57.          }  
  58.    
  59.          public virtual void Update<TEntity>(IEnumerable<TEntity> list) where TEntity : class 
  60.          {  
  61.              list.ToList().ForEach(entity =>  
  62.              {  
  63.                  this.Update<TEntity>(entity);  
  64.              });  
  65.          }  
  66.    
  67.          public virtual void Insert<TEntity>(TEntity entity) where TEntity : class 
  68.          {  
  69.              DB.GetTable<TEntity>().InsertOnSubmit(entity);  
  70.              this.SubmitChanges();  
  71.          }  
  72.    
  73.          public virtual void Insert<TEntity>(IEnumerable<TEntity> list) where TEntity : class 
  74.          {  
  75.              DB.GetTable<TEntity>().InsertAllOnSubmit<TEntity>(list);  
  76.              this.SubmitChanges();  
  77.          }  
  78.    
  79.          public virtual TEntity InsertGetIDENTITY<TEntity>(TEntity entity) where TEntity : class 
  80.          {  
  81.              this.Insert<TEntity>(entity);  
  82.              return GetModel<TEntity>(i => i == entity).FirstOrDefault();  
  83.          }  
  84.    
  85.          public virtual void Delete<TEntity>(TEntity entity) where TEntity : class 
  86.          {  
  87.              DB.GetTable<TEntity>().DeleteOnSubmit(entity);  
  88.              this.SubmitChanges();  
  89.          }  
  90.    
  91.          public virtual void Delete<TEntity>(IEnumerable<TEntity> list) where TEntity : class 
  92.          {  
  93.              DB.GetTable<TEntity>().DeleteAllOnSubmit<TEntity>(list);  
  94.              this.SubmitChanges();  
  95.          }  
  96.    
  97.          public virtual IQueryable<TEntity> GetModel<TEntity>() where TEntity : class 
  98.          {  
  99.              return this.DB.GetTable<TEntity>();  
  100.          }  
  101.    
  102.          public virtual IQueryable<TEntity> GetModel<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate) where TEntity : class 
  103.          {  
  104.              return GetModel<TEntity>().Where(predicate);  
  105.          }  
  106.    
  107.          public virtual TEntity Find<TEntity>(params object[] keyValues) where TEntity : class 
  108.          {  
  109.              var mapping = DB.Mapping.GetTable(typeof(TEntity));  
  110.              var keys = mapping.RowType.IdentityMembers.Select((m, i) => m.Name + " = @" + i).ToArray();  
  111.              TEntity entityTEntity = DB.GetTable<TEntity>().Where(String.Join(" && ", keys), keyValues).FirstOrDefault();  
  112.              if (entityTEntity != null)  
  113.                  DB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, entityTEntity);  
  114.              return entityTEntity;  
  115.          }  
  116.    
  117.          #endregion  
  118.      } 

而用戶模塊User_InfoRepository在做多表關(guān)聯(lián)時,是這樣完成的:

  1. public class User_InfoRepository : XXBBase  
  2.      {  
  3.          /// <summary>  
  4.          /// 需要把Join的表關(guān)系寫在這里  
  5.          /// </summary>  
  6.          /// <returns></returns>  
  7.          public IQueryable<User_Info> GetDetailModel()  
  8.          {  
  9.              var linq = from data1 in base.GetModel<User_Info>()  
  10.                         join data2 in base.GetModel<User_Profile>() on data1.UserID equals data2.UserID  
  11.                         select data1;  
  12.              return linq;  
  13.          }  
  14.      } 

原文鏈接:http://www.cnblogs.com/lori/archive/2012/08/23/2653426.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2021-02-04 18:04:53

DbContext開源對象

2013-09-08 21:41:10

RepositoryUnitOfWorkDbContext

2025-04-18 08:45:26

2024-10-21 07:15:08

2024-01-02 10:31:14

JVM內(nèi)存整體

2011-09-15 09:31:32

云計算PaaS私有云

2012-03-27 14:25:23

私有云PaaS云計算

2011-09-29 09:48:39

私有云PaaS云計算

2020-03-09 15:42:11

網(wǎng)狀網(wǎng)絡(luò)開源FreeMesh

2013-12-16 17:17:01

OpenMp數(shù)據(jù)處理

2022-03-17 08:30:28

Python私有屬性私有方法

2020-04-27 14:43:35

私有部署繪圖服務(wù)

2021-07-01 20:24:01

開源開源工具虛擬專用網(wǎng)絡(luò)

2011-10-21 14:24:03

私有云云計算

2013-01-21 10:51:33

私有云EMCSyncplicity

2016-07-06 15:56:05

云計算

2011-05-23 16:12:39

私有云

2024-05-11 09:41:45

線程安全代碼

2011-06-30 17:21:56

Qt 線程 共享

2024-04-08 10:09:37

TTLJava框架
點贊
收藏

51CTO技術(shù)棧公眾號