<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      開源XDesigner ORM 框架設計

      XDesigner ORM 框架設計

      袁永福 2011-01-20

       

       最新版本源代碼下載地址 https://files.cnblogs.com/xdesigner/XDesignerORM.zip .

      前言

      目前業界已經流行著很多ORM框架,但筆者還是要開發自己的ORM框架,在此不展開關于是否需要重復發明輪子的討論,反正是要開發這個ORM框架,名為XDesignerORM,簡稱XORM。筆者的數據庫開發經驗不大多,但有著很多的圖形軟件開發經驗,相信筆者的一些開發理念能融入到這個ORM框架中,形成一個獨具特色的具有實際應用價值的框架程序。鑒于工作量大,而且避免閉門造車,筆者選擇了開源模式。

      設計理念

      首先講講筆者的設計理念,ORM框架就是為了實現應用程序中的一個個實體對象和數據庫記錄之間的來回映射關系。其實實體對象和數據庫記錄是業務實體模型的兩種表現形式,兩者應該是平等的,但筆者先嘗試下從應用程序的實體對象為中心的設計策略。這樣筆者可以借鑒對象序列化的思想,可以將數據保存到數據庫中視為對象的針對數據庫的序列化過程。

      .NET框架已經提供了三種序列化過程:1.二進制序列化;2.XML序列化;3.CodeDom序列化。最常用的就是XML序列化,而且WebService就是以XML序列化為底層基礎的。

      XML序列化中,對象中的屬性是和XML文檔中的節點一一對應,.NET框架并提供一種通用的XML序列化操作類型System.Xml.XmlSerializer來完整的完成XML序列化和反序列化過程。絕大多數情況下,開發者無需考慮也無需編寫代碼來實現對象和XML文檔之間的映射過程,而在一些必要的情況下為對象類型及其成員添加System.Xml.XmlElementAttribute等說明性質的特性。

      既然XDesignerORM本質上是基于數據庫的對象序列化過程。于是可以參考Xml序列化的原理,應當包含以下幾個部分。

      1 數據庫處理層。能盡量屏蔽各種特定的數據庫的特性。比如MS SQL Server, Oracle , DB2使用的SQL語法的些許不同。初期為了簡單,只支持MS SQL Server,不支持事務。

      2 ORM引擎。框架的核心,能讀取數據庫記錄并創建對象實例,也能根據對象實例來更新數據庫。

      3 ORM特性標記類型。類似XmlTypeAttribute等特性,用于知名對象類型和數據庫之間的映射關系。在默認情況下,對象類型名稱就是數據庫表的名稱,對象屬性的名稱就是數據庫字段的名稱。

       

      比如在一個客戶數據管理系統中,存在以下幾種類型

      CustomerClass,表示客戶的基本信息。

      OrderClass,表示訂單的基本信息。

      ProductClass,表示貨物的基本信息。

      在該系統中,存在多個客戶,而一個客戶有多個訂單,一個訂單包含多個貨物。于是構成了客戶、訂單、貨物的三層的樹狀結構。

      而在本程序的演示數據庫SkyDemo.mdb中有個數據表Customers就保存著很多客戶的基本信息。于是一個CustomerClass類型的對象實例序列化就成為Customers數據表中的一條記錄。

      類似的可以建立其以下的映射關系

      對象類型

      數據表

      CustomerClass

      Customers

      OrderClass

      Orders

      ProductClass

      Products

       

      .NET中,實現對象屬性和數據庫字段的映射關系不算很復雜。但需要實現對象之間的關聯結構與數據庫記錄之間的映射關系。也就是說需要在數據庫中保存對象之間的一對多的關系,其實多對多的關系實際上可以看做雙向的一對多的關系。

      XORM應該可以處理對象之間的多對多的關系。比如,一個CustomerClass客戶對象有多個訂單記錄。于是可以為CustomerClass類型添加一個名為Orders的屬性,該屬性返回客戶名下的所有的OrderClass對象實例。XORM框架讀取數據庫創建一個CustomerClass對象實例時也應該讀取數據庫創建該客戶名下的訂單信息并設置CustomerClass對象的Orders屬性。

      這樣做有一個性能問題,當應用程序僅僅讀取客戶的基本信息,而無需處理客戶名下的訂單信息,此時XORM框架還完整的讀取該客戶名下的訂單信息,這浪費時間浪費內存。于是XORM框架應當支持延遲加載,只有當應用程序訪問CustomerClass對象的Orders屬性時才會再次讀取數據并填充訂單列表。

      在此可以參考代碼注入的技術來截獲應用系統訪問實體數據類型的需要延遲加載的屬性。

      比如當使用以下代碼定義CustomerClass類型的Orders屬性

      Private OrderClass[] myOrders = null;

      Public virtual OrderClass[ ] Orders

      {

             Get

             {

                    Return myOrders;

             }

             Set

             {

                    myOrders = value;

             }

      }

      則采用動態編譯技術從CustomerClass類型動態的創建一個類型,該類型重載了Orders屬性,其代碼如下

      Public override OrderClass[] Orders

      {

             Get

             {

                    If( base.Orders == null )

                    {

                           // 讀取Orders數據表并生成 OrderClass 對象實例數組。

                           Base.Orders = XORM.ReadObjects(“Orders” , typeof( OrderClass ) );

                    }

                    Return base.Orders;

             }

             Set

             {

                    Base.Orders = value;

             }

      }

      這樣當應用程序調用XORM框架生成CustomerClass實例時,實際上獲得的不是CustomerClass類型的實例,而是從CustomerClass上面派生的類型的實例,但使用上沒有什么區別,應用程序仍然能將其當做CustomerClass類型來使用。

      因此編寫實體類型時,對于所有需要延遲加載的屬性都需要設置為可以重載的模式,對于C#也就是添加virtual關鍵字,而且該類型是可以派生的,不能是密封類型,對于C#也就是不能在類型前面加上sealed 關鍵字。

      延遲加載不但能用于處理子對象列表,也能用于處理包含大量的數據的字段,比如保存圖片的二進制字段。

       

      XORM框架還需要處理對象緩存的功能,尤其是在處理業務對象存在多對多的關系的時候,可能會出現對象重復加載的現象,此時需要重復使用已經加載的實體對象,目前暫不考慮。

      使用XORM框架,實體對象與數據庫的映射關系將使用特性附加在程序代碼中,當數據庫表或者字段發生變更,此時需要修改程序源代碼,重新編譯重新部署,這樣降低了程序的靈活度。為此XORM框架將同時支持程序代碼中的特性和XML配置文件的方式。XOMR框架首先分析程序集中的元數據,然后再分析XML配置文件,最后確定出實體對象和數據庫的映射關系。

       

      XORM框架能否快速方便的應用,需要配套使用方便的系統開發和實施輔助工具程序。這些工具程序包括:

      1 代碼生成器。能根據數據庫的表和字段結構自動生成能用于XORM框架的實體類型的源代碼。也就是生成類似上面提到的CustomerClassOrderClass等類型的源代碼。代碼生成器能根據數據庫中定義的外鍵信息生成子對象列表屬性。比如自動生成CustomerClass類型的Orders屬性,并自動設置為延遲加載。

      2 實體類型和數據庫的對比工具。能檢查已經開發好的實體類型與指定數據庫的映射關系,幫助開發者調試和部署XORM框架。

      3 映射配置文件編輯器。能幫助開發者準確的寫出指定的數據庫和實體類型之間的映射關系配置文件。

       

      模塊劃分

      XORM框架大體分為以下幾個程序模塊

      ORM DOM

      ORM DOM 就是一種描述O/R映射關系的文檔對象模型。一個實用的O/R映射關系內部比較復雜,是難于用平面的數據結構來描述的,而文檔對象模型擅長于描述復雜的數據結構,因此在此自定義了一種ORM DOM來描述O/R映射關系。

      ORM DOM主要包含了以下幾種類型

      1.         ORMProjectInfo類型,是DOM結構的頂級對象,是其他模塊訪問ORM DOM的唯一入口點。

      2.         ORMTypeInfo類型,用于描述一種實體類型和數據庫表的映射關系。

      3.         ORMPropertyInfo類型,用于描述實體類型的某個屬性和數據庫中的某個字段的映射關系,還指明該字段是否延遲加載、是否是只讀的、存儲格式等等信息。

      4.         ORMRelationInfo類型,用于描述實體之間的關系,包括一對多的關系和多對多的關系。

       

      ORM DOM 是可以參與XML序列化和反序列化的,因此這為未來同時支持O/R配置文件做好基礎。

       

      此外ORM DOM還定義了ORMTypeMappingHelper類型。該類型定義了執行數據庫映射關系的接口,包括初始化查詢、新增、修改和刪除數據庫記錄的SQL語句。而其他模塊將從整個類型派生出實際使用的幫助類型,而框架引擎在該類型的派生類型的幫助下實現O/R映射。

      ORM DOM中已經實現了ReflectionORMTypeMappingHelper,該類型是基于反射技術的,運行速度比較慢。而框架將使用動態編譯技術生成快速的映射幫助類型。

      DataBase

      這是本框架的數據庫操作模塊,包含了ORMDataBaseORMDBCommand類型。

      ORMDBCommand類型用于存儲SQL命令文本以及配套參數值。

      ORMDataBase類型用于管理數據庫連接。

      Dynamic Compile

      這是本框架的動態編譯功能模塊,包括了CodeGeneratorDynamicCompiler類型。

      CodeGenerator類型是代碼生成器,是根據ORM DOM的信息,生成操作特定實體類型和特定數據表之間的映射關系的C#源代碼文本。這段源代碼會從ORMTypeMappingHelper類型派生出新的類型并實現其中的方法。

      在生成的代碼中,會根據需要從實體類型派生出臨時類型,重載需要延遲加載的屬性,這樣實現了實體屬性數據延遲加載的功能。

      例如實體類型CustomerClass描述一個客戶的基本信息,其定義如下

      [ORMType("Customers")]

      public class CustomerClass

      {

          public CustomerClass()

          {

          }

       

          private string _ID = null ;

          [ORMKeyField()]

          [ORMField("CustomerID")]

          [ORMIDGenerate( ORMIDGenerateStyle.GUID )]

          public virtual string ID

          {

              get { return _ID; }

              set { _ID = value; }

          }

          private string _WebSite = null;

       

          public string WebSite

          {

              get { return _WebSite; }

              set { _WebSite = value; }

          }

       

          private List<OrderClass> _Orders = null;

          [ORMRelation( ORMRelationStyle.OneToMany , "CustomerID",UniteDelete=true)]

          [ORMDelay()]

          public virtual List<OrderClass> Orders

          {

              get { return _Orders; }

              set { _Orders = value; }

          }

      }

      在這里Orders屬性是該客戶類型下所有的訂單信息列表,為了性能,該屬性是標記為延遲加載的。

      而代碼生成器在CustomerClass類型派生了新的類型,并重載了Orders屬性,其演示代碼如下。

      public class CustomerClass_Temp : CustomerClass

      {

          public CustomerClass_Temp()

          {

          }

       

          internal ORMFramework _Work = null;

       

          public override List< OrderClass> Orders

          {

              get

              {

                  if (base.Orders == null && this._Work != null)

                  {

       

                      OrderClass conditionInstance = new OrderClass();

                      conditionInstance.Customer = this;

       

                      Array list = this._Work.ReadInstancesByCondition(

                          conditionInstance,

                          new string[] { "Customer" });

       

                      List< OrderClass> result = newList< OrderClass>();

       

                      foreach (OrderClass item in list)

                      {

                          result.Add(item);

                      }

       

                      base.Orders = result;

                  }

                  return base.Orders;

              }

              set

              {

                  base.Orders = value;

              }

          }

      }//public class TempClass

      在重載的Orders屬性中,若該屬性值為空則調用ORM框架來查詢數據庫,獲得該客戶名下的所有的訂單信息對象,然后填充到訂單列表。如此應用程序讀取數據庫獲得一個客戶信息對象時并不會導致讀取該客戶名下的訂單信息,只有應用程序訪問客戶對象的Orders屬性值時采用啟用延遲加載。這樣做能比較好的提高性能。

      由于需要重載延遲調用的屬性的,因此需要標記為延遲調用的屬性必須是可以重載的,必須標記為abstractvirtualoverride,否則代碼生成器會拋出異常。

       

      DynamicCompiler接受代碼生成器生成的C#代碼,調用微軟.NET框架自帶的C#編譯器生成臨時程序集,然后分析程序集獲得O/R幫助器的類型并創建O/R幫助器實例。這種O/R幫助器具有很高的運行性能,動態編譯技術比較好的兼顧靈活和執行性能。

       

      Engine

      這是本框架的核心模塊,包含了ORMEngineORMContext類型。

      ORMEngine是本框架的頂級對象,它調用其他程序模塊,提供了O/R操作的API

      ORMContext是執行O/R操作過程的上下文信息對象。

       

      目前就寫得這么多了,以后繼續。該ORM框架源代碼的SVN訪問地址為 https://xdesignerorm.svn.sourceforge.net/svnroot/xdesignerorm/  

            

       

      posted on 2011-02-23 10:56  袁永福 電子病歷,醫療信息化  閱讀(4788)  評論(7)    收藏  舉報

      導航

      主站蜘蛛池模板: 国产精品中文第一字幕| 国产精品久久久久久久久软件| 亚洲综合网国产精品一区| 国产精品日韩av在线播放| 中文国产不卡一区二区| 小嫩批日出水无码视频免费| 成人性生交大片免费看中文| 波多野结衣久久一区二区| 日本免费一区二区三区久久| 欧美亚洲国产一区二区三区| 国产资源精品中文字幕| 亚洲视频一区| 欧美乱妇高清无乱码免费| 成av免费大片黄在线观看| 欧美一区二区三区欧美日韩亚洲| 亚洲欧美日韩在线不卡| 美日韩在线视频一区二区三区| 国产女人高潮视频在线观看| 国产特色一区二区三区视频| 美日韩精品综合一区二区| 18禁免费无码无遮挡不卡网站| 晋州市| 色综合久久中文综合久久激情| 麻豆成人精品国产免费| 在线视频不卡在线亚洲| 中文字幕日韩国产精品| 国产AV国片精品有毛| 午夜亚洲AV日韩AV无码大全| 德州市| 欧美大bbbb流白水| 高清无码爆乳潮喷在线观看| 白嫩少妇激情无码| 九九热免费公开视频在线| 国产日韩精品中文字幕| 亚洲v欧美v日韩v国产v| 成人污视频| 中文字幕久久六月色综合| 人妻系列无码专区无码中出| 四虎永久免费高清视频| 免费人成视频网站在线观看18| 欧美日韩国产一区二区三区欧 |