亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

1.連接字符串的創建-Lazy.Framework從零開始設計自己的ORM架構

2019-11-14 14:27:31
字體:
來源:轉載
供稿:網友

 開發初衷

  注冊了博客園已經有幾個月了,卻從來都沒有上來過,本人大概從2010年開始就開始做.NET 方向的開發。

  這個是我在博客園發布的第一個帖子。 主要就是說說最近在寫的一個ORM架構。

   本人接觸的ORM架構也有不少,沒有一個是用著順手的,要么就是配置起來特別吃力,要么就是使用起來不是很方便。 最終還是比較喜歡NHibernate這套架構,因為這套架構支持在Model表的實體類內部包含其他的表的實體類  也就是在使用的時候,連聯表查詢都可以省了 可以直接支持對象.對象的方式來進行查詢數據,屢試不爽,有了它基本已經放棄了使用視圖 或 聯表查詢等等。

  但是用它也有不爽的地方,就是配置起來太麻煩,需要些HQL。

  出于以上種種,想自己動手開發一套,高性能高效率的ORM架構。

  廢話不多說,下面開始說我的構思。、

 初步設計

  開發一套架構的開始,總是要有一套架構的構思的。

  對于這套架構,在實體類中舍去了xml文件的配置,使用了自定義特性。

  1. 用戶發起了一個添加對象的操作

  2. 通過添加的該對象T,去緩存中獲取T對象相關的全部自定義特性,如果緩存中不存在則獲取該T對象的自定義特性存入緩存中

  3. 找到T對象,在去緩存中獲取T-sql語句 由于數據庫不同,所以生成的Sql語句也不相同,如果不存在則新生成,然后放入緩存中。

  4. 獲取到了T-SQL語句后,使用T對象生成 DbParameter[]   使用Emit,動態的創建IL 創建獲取T對象屬性的方法,來進行將T 填充到DbParameter[] 

  5. 通過T對應的配置文件的數據庫連接,實例化不同的數據庫

  6. 實例化數據庫成功后 來進行執行插入

  7. 如果插入的對象 T 是要緩存的話, 將會同時存入內存數據庫

  8. 上述描述的是 添加對象  并不包含獲取對象  如果是獲取對象的話,需要用到AOP 來實現 對象.對象

  

  太專業的話也不會說,大概的流程是這樣的一個流程,實現思路也大概有了一些,先從最底層開始寫起,那就是配置文件中的數據庫連接字符串

 下面是Config 配置文件中的數據庫連接字符串

<?xml version="1.0" encoding="utf-8" ?><configuration>  <connectionStrings>    <add name="Lazy1" connectionString="server=.=sa;pwd=Dieyu;database=Lazy.Framework;" PRoviderName="System.Data.SqlClient"/>    <add name="Lazy2" connectionString="server=.=sa;pwd=Dieyu;database=Lazy;" providerName="System.Data.SqlClient"/>  </connectionStrings></configuration>

 

下述代碼 是先創建了 配置節點的接口

 1 /// <summary> 2     /// <para>代碼說明:</para> 3     /// <para>  數據庫連接字符串接口,用戶存儲數據庫的連接字符串,主要應用于 配置文件的 connectionStrings 的節點數據庫獲取</para> 4     /// <para>使用示例:</para> 5     /// <para>  無</para> 6     /// </summary> 7     public interface ILazyConfiguration 8     { 9         /// <summary>10         /// <para>代碼說明:</para>11         /// <para>  用于設置獲取該對象的唯一標識</para>12         /// <para>使用示例:</para>13         /// <para>  無</para>14         /// </summary>15         string Name { get; set; }16         /// <summary>17         /// <para>代碼說明:</para>18         /// <para>  用于設置數據庫的連接字符串</para>19         /// <para>使用示例:</para>20         /// <para>  如:ConnectionString = "server=.;uid=sa......省略"</para>21         /// </summary>22         string ConnectionString { get; set; }23         /// <summary>24         /// <para>代碼說明:</para>25         /// <para>  用于設置該對象要連接數據庫的類型</para>26         /// <para>使用示例:</para>27         /// <para>  如:ProviderName = "System.Data.SqlClient"</para>28         /// </summary>29         string ProviderName { get; set; }30         /// <summary>31         /// <para>代碼說明:</para>32         /// <para>  用于設置該對象要連接數據庫的類型</para>33         /// <para>使用示例:</para>34         /// <para>  如:DataType = DataType.System_Data_SqlClient</para>35         /// </summary>36         LazyDataTypeEnum DataType { get; set; }37     }

 下面是集成了接口的配置類

 1 /// <summary> 2     /// <para>代碼說明:</para> 3     /// <para>  數據庫連接字符串對象,用戶存儲數據庫的連接字符串,主要應用于 配置文件的 connectionStrings 的節點數據庫獲取</para> 4     /// <para>使用示例:</para> 5     /// <para>  無</para> 6     /// </summary> 7     internal partial class LazyConfiguration : ILazyConfiguration 8     { 9         /// <summary>10         /// 配置節點名稱,此鍵唯一,不能擁有重復11         /// </summary>12         public string Name { get; set; }13         /// <summary>14         /// <para>代碼說明:</para>15         /// <para>  配置節點字符串</para>16         /// <para>使用示例:</para>17         /// <para>  如:ConnectionString = "server=.;uid=sa......省略"</para>18         /// </summary>19         public string ConnectionString { get; set; }20         /// <summary>21         /// <para>代碼說明:</para>22         /// <para>  配置節點要連接的數據庫驅動</para>23         /// <para>使用示例:</para>24         /// <para>  如:ProviderName = "System.Data.SqlClient"</para>25         /// </summary>26         public string ProviderName { get; set; }27         /// <summary>28         /// <para>代碼說明:</para>29         /// <para>  用于設置該對象要連接數據庫的類型</para>30         /// <para>使用示例:</para>31         /// <para>  如:DataType = DataType.System_Data_SqlClient</para>32         /// </summary>33         public LazyDataTypeEnum DataType { get; set; }34     }

 

 當配置節點類與接口都創建完成了后  由于是多個數據庫連接串, 我們需要創捷 節點類的集合

  1 /// <summary>  2     /// <para>代碼說明:</para>  3     /// <para>  配置節點訪問集合,用來獲取數據庫連接字符串的節點信息</para>  4     /// <para>使用示例:</para>  5     /// <para>  只提供程序集內部使用,外部訪問無效</para>  6     /// </summary>  7     public class LazyConfigurationCollection : IEnumerable  8     {  9         #region <<私有屬性>> 10         /// <summary> 11         /// 私有靜態集合,用于保證全局唯一性 12         /// </summary> 13         private static IList<ILazyConfiguration> listLazyConfiguration = new List<ILazyConfiguration>(); 14         #endregion 15  16         #region <<公共屬性>> 17         /// <summary> 18         /// <para>代碼說明:</para> 19         /// <para>  通過索引獲取一個ILazyConfiguration對象</para> 20         /// <para>使用示例:</para> 21         /// <para>  如:ILazyConfiguration[0]</para> 22         /// </summary> 23         /// <param name="index">索引位置</param> 24         /// <returns>ILazyConfiguration對象</returns> 25         public ILazyConfiguration this[int index] 26         { 27             get 28             { 29                 return listLazyConfiguration[index]; 30             } 31         } 32         /// <summary> 33         /// <para>代碼說明:</para> 34         /// <para>  通過名稱獲取一個ILazyConfiguration對象</para> 35         /// <para>使用示例:</para> 36         /// <para>  如:ILazyConfiguration["LazySql......."]</para> 37         /// </summary> 38         /// <param name="name">要獲取連接字符串的名稱</param> 39         /// <returns>ILazyConfiguration對象</returns> 40         public ILazyConfiguration this[string name] 41         { 42             get 43             { 44                 return listLazyConfiguration.FirstOrDefault(P => P.Name == name); 45             } 46         } 47         /// <summary> 48         /// <para>代碼說明:</para> 49         /// <para>  返回序列中的第一個元素;如果序列中不包含任何元素,則返回默認值。</para> 50         /// <para>使用示例:</para> 51         /// <para>  無</para> 52         /// </summary> 53         public ILazyConfiguration FirstOrDefaultConfiguration 54         { 55             get 56             { 57                 return listLazyConfiguration.FirstOrDefault(); 58             } 59         } 60         /// <summary> 61         /// <para>代碼說明:</para> 62         /// <para>  返回集合的總數</para> 63         /// <para>使用示例:</para> 64         /// <para>  如:ILazyConfiguration.Count</para> 65         /// </summary> 66         public int Count 67         { 68             get 69             { 70                 return listLazyConfiguration.Count; 71             } 72         } 73         #endregion 74  75         #region <<構造函數>> 76         /// <summary> 77         /// <para>代碼說明:</para> 78         /// <para>  實例化一個新的對象,該構造函數只能有程序集內部訪問</para> 79         /// <para>使用示例:</para> 80         /// <para>  無</para> 81         /// </summary> 82         internal LazyConfigurationCollection() 83         { 84             //無 85         } 86         #endregion 87  88         #region <<私有方法>> 89         /// <summary> 90         /// <para>代碼說明:</para> 91         /// <para>  向集合內添加一個對象</para> 92         /// <para>使用示例:</para> 93         /// <para>  無</para> 94         /// </summary> 95         /// <param name="item">ILazyConfiguration對象</param> 96         internal void Add(ILazyConfiguration item) 97         { 98             listLazyConfiguration.Add(item); 99         }100         #endregion101 102         #region <<公共方法>>103         /// <summary>104         /// <para>代碼說明:</para>105         /// <para>  返回一個循環訪問集合的枚舉器,可用于linq等查詢</para>106         /// <para>使用示例:</para>107         /// <para>  無</para>108         /// </summary>109         public IEnumerator GetEnumerator()110         {111             return listLazyConfiguration.GetEnumerator();112         } 113         #endregion114     }

 節點集合創建完成后 , 我們需要一個單利模式, 來永遠的保存著這些節點

 1 /// <summary> 2     /// <para>代碼說明:</para> 3     /// <para>  獲取配置節配置的數據庫連接字符串,該類只會被全局實例化一次</para> 4     /// <para>使用示例:</para> 5     /// <para>  LazyConfigurationProperty LazyConfigurationProperty = LazyConfigurationProperty.GetLazyConfigurationProperty()</para> 6     /// </summary> 7     public sealed class LazyConfigurationProperty 8     { 9         #region <<私有屬性>>10         /// <summary>11         /// 創建全為唯一私有lazyConfigurationProperty 對象12         /// </summary>13         private static LazyConfigurationProperty lazyConfigurationProperty;14         /// <summary> 15         /// 程序運行時,創建一個靜態只讀的進程輔助對象16         /// </summary>17         private static readonly object _object = new object();18         #endregion19 20         #region <<公共屬性>>21         /// <summary>22         /// <para>代碼說明:</para>23         /// <para>  獲取配置文件的配置節的集合</para>24         /// <para>使用示例:</para>25         /// <para>  如:LazyConfigurations["xx"] or LazyConfigurations[i].....</para>26         /// </summary>27         public LazyConfigurationCollection LazyConfigurations { get; private set; }28         #endregion29 30         #region <<構造函數>>31         /// <summary>32         /// 構造方法私有,外鍵不能通過New類實例化此類33         /// </summary>34         private LazyConfigurationProperty() { }35         #endregion36 37         #region <<公共方法>>38         /// <summary>39         /// <para>代碼說明:</para>40         /// <para>  單例模式,數據庫配置對象, 全局唯一創建對象的入口</para>41         /// <para>使用示例:</para>42         /// <para>  LazyConfigurationProperty LazyConfigurationProperty = LazyConfigurationProperty.GetLazyConfigurationProperty()</para>43         /// </summary>44         /// <returns>LazyConfigurationProperty全局唯一對象</returns>45         public static LazyConfigurationProperty GetLazyConfigurationProperty()46         {47             //先判斷實例是否存在,不存在再加鎖處理48             if (lazyConfigurationProperty == null)49             {50                 //在同一時刻加了鎖的那部分程序只有一個線程可以進入,51                 lock (_object)52                 {53                     //如實例不存在,則New一個新實例,否則返回已有實例54                     if (lazyConfigurationProperty == null)55                     {56                         lazyConfigurationProperty = new LazyConfigurationProperty();57                         //配置節點集合58                         lazyConfigurationProperty.LazyConfigurations = new LazyConfigurationCollection();59 60                         //像LazyConfigurationCollection添加對象61                         var LazyConfigurationList = SettingConnectionStrings.GetConnectionStrings();62                         foreach (var item in LazyConfigurationList)63                         {64                             lazyConfigurationProperty.LazyConfigurations.Add(item);65                         }66                     }67                 }68             }69             return lazyConfigurationProperty;70         }71         #endregion72     }

當此上述類被構建時 , 調用了下面類的方法, 將所有連接字符串 都裝入上述類的集合中

 1 /// <summary> 2     /// <para>代碼說明:</para> 3     /// <para>  配置文件對象初始化類,檢查配置文件,初始化連接對象</para> 4     /// <para>使用示例:</para> 5     /// <para>  如:SettingConnectionStrings.GetLazyConnectionStrings()</para> 6     /// </summary> 7     internal sealed class SettingConnectionStrings 8     { 9         /// <summary>10         /// <para>代碼說明:</para>11         /// <para>  獲取配置文件中的ConnectionStrings節中的全部數據中的Lazy配置集合</para>12         /// <para>使用示例:</para>13         /// <para>  如:SettingConnectionStrings.GetLazyConnectionStrings()</para>14         /// </summary>15         /// <returns>返回Lazy配置集合</returns>16         internal static IEnumerable<ConnectionStringSettings> GetLazyConnectionStrings()17         {18             //獲取全部數據庫連接19             var _ConnectionStrings = ConfigurationManager.ConnectionStrings;20             //獲取數據庫配置的連接字符串21             var _LazyConnectionStrings = _ConnectionStrings.Cast<ConnectionStringSettings>().Where(P => P.Name.IndexOf("Lazy") == 0);22             if (_LazyConnectionStrings.Count() <= 0)23             {24                 //如果未配置任何連接字符串,則出現此異常25                 throw new ArgumentNullException("connectionStrings", "在配置文件中, connectionStrings 節點,并不包含數據庫連接字符串的配置, 要解決此錯誤,需要在配置文件中 connectionStrings 節點內添加 /"name/" 以 Lazy 開頭的節點配置");26             }27 28             return _LazyConnectionStrings;29         }30         /// <summary>31         /// <para>代碼說明:</para>32         /// <para>  獲取配置文件中的ConnectionStrings節中的全部數據中的Lazy配置集合</para>33         /// <para>使用示例:</para>34         /// <para>  如:SettingConnectionStrings.GetConnectionStrings()</para>35         /// </summary>36         /// <returns>返回Lazy配置集合</returns>37         internal static IList<ILazyConfiguration> GetConnectionStrings()38         {39             //獲取節點集合40             var _ConnectionStringSettingsList = GetLazyConnectionStrings();41             //設置返回集合42             IList<ILazyConfiguration> _LazyConfigurationList = new List<ILazyConfiguration>();43             foreach (ConnectionStringSettings connectionStringSettings in _ConnectionStringSettingsList)44             {45                 LazyDataTypeEnum _LazyDataType;46                 try47                 {48                     //將ProviderName轉換成枚舉,如果失敗則觸發異常49                     _LazyDataType = (LazyDataTypeEnum)Enum.Parse(typeof(LazyDataTypeEnum),connectionStringSettings.ProviderName.Replace('.', '_'));50                 }51                 catch52                 {53                     //如果無法轉換為枚舉 , 則引發異常.54                     StringBuilder _ErrorMsg =new StringBuilder();55                     _ErrorMsg.Append("在位置文件中,connectionStrings 節點下的子節點,并不包含 /"ProviderName/" 的屬性配置,或并不屬于以下的一種:/n");56                     _ErrorMsg.Append("System.Data.Odbc/n");57                     _ErrorMsg.Append("System.Data.OleDb/n");58                     _ErrorMsg.Append("System.Data.OracleClient/n");59                     _ErrorMsg.Append("System.Data.SqlClient/n");60                     _ErrorMsg.Append("MySQL.Data.MySqlClient/n");61                     _ErrorMsg.Append("  要解決此問題,請按此配置,如下/n");62                     _ErrorMsg.Append(" <add name=/"LazySqlConnection/"  connectionString=/"server=....省略;/" providerName=/"System.Data.SqlClient/" />/n");63                     throw new ArgumentNullException("ProviderName", _ErrorMsg.ToString());64                 }65 66                 if (_LazyConfigurationList.Count(P => P.Name == connectionStringSettings.Name) > 0)67                 {68                     throw new ArgumentNullException("Name", "在配置文件中, connectionStrings 節點,存在相同 /"name/" 的節點.");69                 }70 71                 //添加集合72                 _LazyConfigurationList.Add(new LazyConfiguration()73                 {74                     ConnectionString = connectionStringSettings.ConnectionString,75                     Name = connectionStringSettings.Name,76                     ProviderName = connectionStringSettings.ProviderName,77                     DataType = _LazyDataType78                 });79                 80             }81             return _LazyConfigurationList;82         }83     }

上面代碼是寫關于 配置連接字符串的存儲

下面再放入一個數據庫類型的枚舉

 1  /// <summary> 2     /// <para>代碼說明:</para> 3     /// <para>  數據庫類型枚舉</para> 4     /// <para>使用示例:</para> 5     /// <para>  LazyDataTypeEnum.SQLServer</para> 6     /// </summary> 7     public enum LazyDataTypeEnum 8     { 9         /// <summary>10         /// System.Data.Odbc11         /// </summary>12         System_Data_Odbc,13         /// <summary>14         /// System.Data.OleDb15         /// </summary>16         System_Data_OleDb,17         /// <summary>18         /// System.Data.OracleClient19         /// </summary>20         System_Data_OracleClient,21         /// <summary>22         /// System.Data.SqlClient23         /// </summary>24         System_Data_SqlClient,25         /// <summary>26         /// MySql.Data.MySqlClient27         /// </summary>28         MySql_Data_MySqlClient29 30     } 

 

 

第一天,相關連接字符串的存儲 就先寫到這里  歡迎指點。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青草青草久热精品视频在线观看| 6080yy精品一区二区三区| 欧美国产精品人人做人人爱| 午夜欧美不卡精品aaaaa| 欧美日韩福利在线观看| 欧美日韩亚洲网| 国产午夜精品一区理论片飘花| 欧美成人四级hd版| 精品久久久久久久久久国产| 国产裸体写真av一区二区| 最近中文字幕mv在线一区二区三区四区| 亚洲国产欧美在线成人app| 亚洲女人天堂视频| 热99精品里视频精品| 欧洲成人在线视频| 亚洲精品中文字幕女同| 久久精品国产91精品亚洲| 欧美日韩成人黄色| 日韩av电影国产| 日韩av在线影院| 日韩欧美成人区| 国产精品自拍网| 精品国产999| 国产男人精品视频| 91精品美女在线| 国产精品一区二区在线| 色婷婷综合成人av| 成人午夜黄色影院| 成人欧美一区二区三区在线| 中文字幕精品影院| 色噜噜狠狠狠综合曰曰曰88av| 中文字幕亚洲综合久久| 日韩免费观看高清| 91精品国产高清久久久久久久久| 日韩在线精品视频| 亚洲的天堂在线中文字幕| 狠狠综合久久av一区二区小说| 亚洲人成自拍网站| 91精品国产91久久久久久吃药| 久久电影一区二区| 一区二区三欧美| 久久久精品视频在线观看| 亚洲精品自拍第一页| 91国产视频在线| 欧美在线中文字幕| 久久成人亚洲精品| 国产99久久精品一区二区永久免费| 日韩少妇与小伙激情| www.午夜精品| 欧美理论电影网| 国产日韩欧美电影在线观看| 欧美日韩不卡合集视频| 91精品视频在线免费观看| 热久久这里只有精品| 欧美日韩一区二区三区在线免费观看| 成人精品aaaa网站| 国外色69视频在线观看| 欧美亚洲在线视频| 国产精品你懂得| 欧美肥婆姓交大片| 欧美精品videossex性护士| 日韩电视剧免费观看网站| 美日韩精品视频免费看| 668精品在线视频| 亚洲风情亚aⅴ在线发布| 欧美大片在线免费观看| 成人在线一区二区| 精品久久香蕉国产线看观看亚洲| 一本大道香蕉久在线播放29| 久久久久国产精品免费| 在线不卡国产精品| 久久精品久久久久| 91极品视频在线| 美日韩精品免费视频| 亚洲精品国产综合久久| 色噜噜狠狠狠综合曰曰曰88av| 欧美在线性视频| 日产精品久久久一区二区福利| 欧美激情在线狂野欧美精品| 国产91成人在在线播放| 亚洲va久久久噜噜噜久久天堂| 国产精品国产福利国产秒拍| 成人xxxxx| 亚洲第一中文字幕在线观看| 亚洲精品乱码久久久久久按摩观| 91免费精品国偷自产在线| 久久影视电视剧免费网站清宫辞电视| 大荫蒂欧美视频另类xxxx| 亚洲剧情一区二区| 久久人人爽人人爽人人片av高请| 中文字幕av一区中文字幕天堂| 亚洲精品www久久久| 国产成人精品国内自产拍免费看| 精品视频—区二区三区免费| 欧美日韩精品中文字幕| 在线看福利67194| 国产精品扒开腿做| 久久久久久成人| 国产精品自拍小视频| 欧美日韩美女在线观看| 亚洲影院高清在线| 在线成人激情黄色| 欧美日韩精品中文字幕| 国产在线日韩在线| 国产成人中文字幕| 亚洲激情在线观看视频免费| www.亚洲人.com| 96精品久久久久中文字幕| 欧美在线欧美在线| 亚洲精品国产精品国产自| 57pao国产精品一区| 久久久久99精品久久久久| 国产精品自拍偷拍视频| 国产精品免费久久久久久| 亚洲美女在线观看| 2018日韩中文字幕| 国产精品亚洲综合天堂夜夜| 欧美国产亚洲视频| 亚洲天堂免费视频| 国产精品亚洲欧美导航| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲在线免费看| 九九九久久久久久| 久久久999精品视频| 欧美黑人国产人伦爽爽爽| 一区二区三区黄色| 亚洲久久久久久久久久| 日韩一区av在线| 亚洲视频免费一区| 日韩中文字幕在线免费观看| 久久久人成影片一区二区三区观看| 亚洲人成啪啪网站| 91禁国产网站| 97久久精品国产| 中文字幕一区二区精品| 91日本在线观看| 亚洲精品美女在线| 亚洲国产日韩欧美在线99| 久久免费视频网站| 国内精品中文字幕| 国产精品美女免费视频| 色婷婷久久一区二区| 川上优av一区二区线观看| 亚洲国产精久久久久久| 国产精品偷伦免费视频观看的| 久久成人一区二区| 91视频九色网站| 日韩一二三在线视频播| 日本中文字幕不卡免费| 国产精品入口夜色视频大尺度| 青草热久免费精品视频| 欧美猛男性生活免费| 国产精品网站入口| 91免费国产网站| 中文字幕免费精品一区高清| 日韩免费av一区二区| 韩国v欧美v日本v亚洲| 日产精品久久久一区二区福利| 欧美成人全部免费| 亚洲自拍在线观看| 中文字幕视频一区二区在线有码| 亚洲成人av中文字幕| 丝袜一区二区三区| 91久久久久久国产精品|