欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
實(shí)戰揭秘:開(kāi)發(fā).Net平臺應用系統框架

實(shí)戰揭秘:開(kāi)發(fā).Net平臺應用系統框架

 

   作者:孫亞民本文選自:賽迪網(wǎng)
  微軟的.Net平臺給應用程序開(kāi)發(fā)提供了一個(gè)非常好的基礎系統平臺,但是,如何在這個(gè)系統平臺上構建 自己的應用系統,還需要我們針對應用系統的特點(diǎn),構建自己的應用系統框架(Framework)。我們在應用.Net開(kāi)發(fā)系統的過(guò)程中,結合多年的開(kāi)發(fā)經(jīng) 驗,也參考了J2EE的架構,設計了一套.Net下的應用系統框架,以及相應的中間件和開(kāi)發(fā)工具,已經(jīng)在多個(gè)項目中和軟件產(chǎn)品中應用,取得了很好的效果。 現在向代價(jià)介紹這個(gè)框架的整體解決方案,希望對您有所幫助。
  
  我們知道,對于典型的三層應用系統來(lái)說(shuō),通??梢园严到y分成以下三個(gè)層次:
  
  · 數據庫層
  
  · 用戶(hù)界面層
  
  · 應用服務(wù)層
  
  對于應用系統來(lái)說(shuō),在這三個(gè)層次中,系統的主要功能和業(yè)務(wù)邏輯在應用服務(wù)層進(jìn)行處理,對于系統框架來(lái)說(shuō),主要處理的也是這個(gè)層次的架構。
  
  對于應用服務(wù)層來(lái)說(shuō),在一個(gè)面向對象的系統中,以下幾個(gè)方面的問(wèn)題是必須要處理的:
  
  · 數據的表示方式,也就是實(shí)體類(lèi)的表示方式,以及同數據庫的對應關(guān)系,即所謂的O-R Map的問(wèn)題。
  
  · 數據的存取方式,也就是實(shí)體類(lèi)的持久化問(wèn)題,通常采用數據庫來(lái)永久存儲數據實(shí)體,這就需要解決同數據庫的交互問(wèn)題。這個(gè)部分要完成的功能,就是將數據實(shí)體保存到數據庫中,或者從數據庫中讀取數據實(shí)體。同這個(gè)部分相關(guān)的,就是對數據訪(fǎng)問(wèn)對象的使用。在框架中,我們對ADO.Net又做了一層封裝,使其使用更加簡(jiǎn)便,同時(shí)也統一了對ADO.Net的使用方式。
  
  · 業(yè)務(wù)邏輯的組織方式。在面向對象的系統中,業(yè)務(wù)邏輯是通過(guò)對象間的消息傳遞來(lái)實(shí)現的。在這個(gè)部分,為了保證邏輯處理的正確性和可靠性,還必須支持事務(wù)處理的能力。
  
  · 業(yè)務(wù)服務(wù)的提供方式。為了保證系統的靈活性和封裝性,系統必須有一個(gè)層來(lái)封裝這些業(yè)務(wù)邏輯,向客戶(hù)端提供服務(wù),同時(shí)作為系統各個(gè)模塊間功能調用的接口,保證系統的高內聚和低耦合性。這里的客戶(hù)指的不是操作的用戶(hù),而是調用的界面、其他程序等。Web層(ASP.Net頁(yè)面)通常只同這個(gè)部分交互,而不是直 接調用業(yè)務(wù)邏輯層或者數據實(shí)體的功能。
  
  為了能夠很好的解決這些問(wèn)題,我們設計了這個(gè)框架。在框架中,針對以上問(wèn)題,我們將應用服務(wù)層又劃分成五個(gè)層次:數據實(shí)體層、實(shí)體控制層、數據訪(fǎng)問(wèn)層、業(yè)務(wù)規則層和業(yè)務(wù)外觀(guān)層。各個(gè)層次同上述問(wèn)題的關(guān)系可以用表表示如下:
  
  
  層次 問(wèn)題
  數據實(shí)體層 數據的表示方式
  實(shí)體控制層 數據的存取方式
  數據訪(fǎng)問(wèn)層 提供對數據庫的訪(fǎng)問(wèn),封裝ADO.Net
  業(yè)務(wù)規則層 業(yè)務(wù)邏輯的組織方式
  業(yè)務(wù)外觀(guān)層 業(yè)務(wù)服務(wù)的提供方式
  
  
  
  整個(gè)系統的結構圖如下:
  
  

  
  圖中的箭頭表示使用關(guān)系
  
   將系統劃分成這么多層次,其好處是能夠使得系統的架構更加清晰,這樣每個(gè)層次完成的功能就比較單一,功能的代碼有規律可循,也就意味著(zhù)我們可以開(kāi)發(fā)一些工具來(lái)生成這些代碼,從而減少代碼編寫(xiě)的工作量,使得開(kāi)發(fā)人員可以將更多的精力放到業(yè)務(wù)邏輯的處理上。正是基于這個(gè)想法,我們同時(shí)開(kāi)發(fā)了針對這個(gè)框架的開(kāi)發(fā)工具,并在實(shí)際工作中減少很多代碼的編寫(xiě)量,效果非常好。同時(shí),為了應用服務(wù)層更好的工作,我們設計了一個(gè)支持這個(gè)框架的應用系統中間件。(現在,已經(jīng)有多家其他公司在試用這個(gè)中間件系統。)
  
  同J2EE的EntityBean不同的是,我們采用了數據實(shí)體和實(shí)體控制分開(kāi)的設計方法,這樣的做法會(huì )帶來(lái)一定的好處。
  
  下面我將各個(gè)部分的設計方案和策略詳細介紹如下:
  
  數據實(shí)體層
  
  我們首先需要解決的是數據的表示方式的問(wèn)題,也就是通常的O-R Map的問(wèn)題。
  
  O-R Map通常的做法是將程序中的類(lèi)映射到數據庫的一個(gè)或多個(gè)表,例如一個(gè)簡(jiǎn)單的Product類(lèi):
  
  
  public class Product
   {
   string ProductID;
   string ProductName;
   float Account;
  }
  
  
  
  
  在數據庫中可能對應了一張Product表:
  
  
  字段名 數據類(lèi)型
  ProductID Varchar(40)
  ProductName Varchar(50)
  Account float
  
  
  
   這是最通常的做法,但是,由這種方式會(huì )帶來(lái)一些問(wèn)題。首先就是數據實(shí)體在數據庫和程序中的表現方式不一樣,對于一些涉及到多個(gè)表的“粗粒度對象”,一個(gè)實(shí) 體類(lèi)可能會(huì )引用到多個(gè)其它實(shí)體類(lèi),也就是說(shuō)會(huì )在涉及到對象粒度的建模方面帶來(lái)一些問(wèn)題;其次在同數據庫交互時(shí),也涉及到一個(gè)轉換的問(wèn)題,如果一個(gè)對象涉及到對多個(gè)表的操作,問(wèn)題就更大;最后,當系統做查詢(xún)操作,需要返回多個(gè)對象時(shí),因為涉及到轉換的問(wèn)題,效率就比較低下,而如果采用直接返回數據集的方式,雖然能夠提高效率,又會(huì )帶來(lái)數據表達方式不一致的問(wèn)題。
  
  考慮到上述問(wèn)題,我們在數據實(shí)體的表現上采用了另外一種方式,那就是利用DataSet。DataSet是微軟在A(yíng)DO.Net中新提出的數據對象,同ADO的Recordset不同的是,他能夠容納多個(gè)記錄集。 DataSet類(lèi)似于一個(gè)內存數據庫,由多個(gè)DataTable組成,而一個(gè)DataTable又有多個(gè)Column。這樣的結構,使得他可以同數據庫很 好的進(jìn)行映射。同時(shí),我們吸取了J2EE架構中CMP使用XML文件定義實(shí)體類(lèi)結構的優(yōu)點(diǎn),采用了類(lèi)似的解決方案。
  
  因此,在這個(gè)方面我們是這樣來(lái)進(jìn)行處理的:
  
  1) 核心類(lèi)庫定義了EntityData類(lèi),這個(gè)類(lèi)繼承了DataSet,添加了一些方法,用來(lái)作為所有實(shí)體類(lèi)的框架類(lèi),定義了各個(gè)實(shí)體類(lèi)的一般結構,至于每個(gè)實(shí)體類(lèi)具體的結構,在運行時(shí)刻由下述辦法確定:
  
  2) 實(shí)體類(lèi)的定義通過(guò)XML文件來(lái)確定,該XML文件符合JIXML對象實(shí)體描述語(yǔ)言的規范(注:JIXML是我們開(kāi)發(fā)的 對象-實(shí)體 映射語(yǔ)言),用于確定實(shí)體類(lèi)的結構。例如,一個(gè)關(guān)于訂單的實(shí)體類(lèi)的定義可能類(lèi)似于下面的結構:
  
  3) 實(shí)體對象的結構由一系列的類(lèi)構造器在運行時(shí)刻,根據上述規范制定的XML來(lái)生成。這些類(lèi)構造器實(shí)現IClassBuilder接口。我們在系統核心類(lèi)庫中預定義了一些標準的Builder,一般情況下,直接使用這些標準的Builder就可以了。
  
  類(lèi)構造器采用的類(lèi)構造工廠(chǎng)的設計模式,如果使用者覺(jué)得標準的Builder不能滿(mǎn)足要求,也可以擴展IClassBuilder接口,編寫(xiě)自己的類(lèi)構造器,然后在系統配置文件中指明某各類(lèi)的類(lèi)構造器的名稱(chēng)即可。
  
  IClassBuilder的定義如下:
  
  
  public interface IClassBuilder
   {
   EntityData BuildClass(string strClassName); //獲取類(lèi)數據結構
   SqlStruct GetSqlStruct(string strClassName,string strSqlName);
   }
  
  
  
  
  這個(gè)部分的結構可以用類(lèi)圖表示如下:
  
  


  當使用者需要某個(gè)實(shí)體類(lèi)的時(shí)候,只要采用如下語(yǔ)句:
  
  
  EntityDataentity=EntityDataManager.GetEmptyEntity("Product");
  
  
  
  
  EntityDataManager的GetEmptyEntity方法通過(guò)調用ClassBuilder的BuildClass來(lái)實(shí)現,并且實(shí)現對象的緩存功能。
  
  ClassBuilder的BuildClass方法實(shí)現如下:
  
  
  public EntityData BuildClass(string strClassName)
   {
   IClassBuilder
  builder=ClassBuilderFactory.GetClassBuilder(strClassName);
   return builder.BuildClass(strClassName);
   }
  
  
  
  
  這兒綜合使用了Builder和Factory的設計模式。ClassBuilderFactory的作用是根據實(shí)體類(lèi)的名稱(chēng),讀取配置文件中相應的類(lèi)構造器的具體類(lèi)名,并返回具體的類(lèi)構造器。
  
  配置文件ClassBuilders.xml的結構很簡(jiǎn)單:
  
  
  <?xml version="1.0" encoding="gb2312" ?>
  <Builders>
   <Class Name="ProductType"
  BuilderName="Jobsinfo.SingleTableClassBuilder" />
  </Builders>
  
  
  
  
  如果沒(méi)有為某個(gè)實(shí)體類(lèi)指明具體的Builder,系統將調用默認的Builder來(lái)構造實(shí)體對象的結構。
  
  系統同時(shí)提供了實(shí)體對象緩存服務(wù)。通過(guò)上述方式產(chǎn)生的實(shí)體對象可以被緩存,這樣,在第二次調用該對象時(shí),可以從緩存中讀取,而不用從頭重新生成,從而大大提高了系統的性能。
  
  在實(shí)際的開(kāi)發(fā)過(guò)程中,我們感覺(jué)到,數據實(shí)體層采用這種設計模式具有以下優(yōu)點(diǎn):
  
  · 實(shí)體類(lèi)定義XML文件可以通過(guò)工具來(lái)自動(dòng)生成,減輕開(kāi)發(fā)工作量。
  
  · 在執行查詢(xún)操作時(shí),不論是返回一個(gè)實(shí)體,還是多個(gè)實(shí)體,數據的表現方式都一樣,都是EntityData,而不存在如上面所述的單個(gè)對象和數據集的表現方式不統一的問(wèn)題。
  
  · 在修改實(shí)體類(lèi)的定義時(shí),如果修改的部分不涉及到業(yè)務(wù)邏輯的處理,只需要修改XML文件就可以了,不用修改其它程序和重新編譯。
  
  · 系統提供的實(shí)體對象緩存服務(wù)可以大大提高了系統的性能。
  
  · 類(lèi)構造工廠(chǎng)的設計模式大大提高了系統的靈活性。
  實(shí)體控制層
  
  解決和O-R Map的問(wèn)題,需要考慮的就是實(shí)體類(lèi)的持久性問(wèn)題了,也就是同數據庫的交互問(wèn)題。實(shí)體控制層用于控制數據的基本操作,如增加、修改、刪除、查詢(xún)等,同時(shí)為業(yè)務(wù)規則層提供數據服務(wù)。
  
  實(shí)體控制層的類(lèi)實(shí)現IEntityDAO接口。這個(gè)接口定義了實(shí)現數據操縱的主要必要方法,包括增加、修改、刪除和查找。IEntityDAO的定義如下:
  
  
  public interface IEntityDAO : IDisposable
   {
   void InsertEntity(EntityData entity);
   void UpdateEntity(EntityData entity);
   void DeleteEntity(EntityData entity);
   EntityData FindByPrimaryKey(object strKeyValue);
   }
  
  
  
  
  可以看到,這個(gè)接口同J2EE中EntityBean的接口定義很象,實(shí)際上,我們也是參考了EntityBean的解決方案。
  
  下面是一個(gè)Product的DAO類(lèi)的例子:
  
  
  public class ProductEntityDAO: IEntityDAO
  {
   private DBCommon db; //這是數據庫訪(fǎng)問(wèn)的類(lèi)
   public ProductEntityDAO()
   {
   db=new DBCommon();
   db.Open();
   }
   public ProductEntityDAO(DBCommon cdb)
   {
   this.db=cdb;
   }
   // 插入一個(gè)實(shí)體
   public void InsertEntity(EntityData entity)
   {
   CheckData(entity);
   db.BeginTrans();
   try
   {
   foreach(DataRow row in
  entity.Tables["Product"].Rows)
  db.exeSql(row,SqlManager.GetSqlStruct("Product","InsertProduct"));
   db.CommitTrans();
   }
   catch(Exception e)
   {
   db.RollbackTrans();
   throw e;
   }
   }
  
   //修改一個(gè)實(shí)體類(lèi)
   public void UpdateEntity(EntityData entity)
   {
   CheckData(entity);
   db.BeginTrans();
   try
   {
   foreach(DataRow row in
  entity.Tables["Product"].Rows)
   if(row.RowState!=DataRowState.Unchanged)
  db.exeSql(row,SqlManager.GetSqlStruct("Product","UpdateProduct"));
   db.CommitTrans();
   }
   catch(Exception e)
   {
   db.RollbackTrans();
   throw e;
   }
   }
   //刪除一個(gè)實(shí)體類(lèi)
   public void DeleteEntity(EntityData entity)
   {
   CheckData(entity);
   db.BeginTrans();
   try
   {
   foreach(DataRow row in
  entity.Tables["Product"].Rows)
  db.exeSql(row,SqlManager.GetSqlStruct("Product","DeleteProduct"));
   db.CommitTrans();
   }
   catch(Exception e)
   {
   db.RollbackTrans();
   throw e;
   }
   }
   //查找實(shí)體類(lèi)
   public EntityData FindByPrimaryKey(object KeyValue)
   {
   EntityData entity=new EntityData("Product");
   SqlStruct
  sqlProduct=SqlManager.GetSqlStruct("Product","SelectByIDProduct");
  db.FillEntity(sqlProduct.SqlString,sqlProduct.ParamsList[0],
  KeyValue,entity,"Product");
   return entity;
   }
   public EntityData FindAllProduct()
   {
   EntityData entity=new EntityData("Product");
   SqlStruct
  sqlProduct=SqlManager.GetSqlStruct("Product","FindAllProduct");
  db.FillEntity(sqlProduct.SqlString,null,null,entity,"Product");
   return entity;
   }
   // 校驗數據數據輸入的有效性
   private void CheckData(EntityData entity)
   {
  if(entity.Tables["Product"].Rows[0]["ProductID"].ToString().Length>40)
   throw new ErrorClassPropertyException
  ("Property ProductID should be less than 40 characters");
   }
   public void Dispose()
   {
   Dispose(true);
   GC.SuppressFinalize(true);
   }
   protected virtual void Dispose(bool disposing)
   {
   if (! disposing)
   return; // we‘re being collected,
   so let theGC take care of this object
   db.Close();
   }
  }
  
  
  
  
  同數據實(shí)體層相結合,這兩部分實(shí)現了應用服務(wù)層同數據庫的交互。這兩個(gè)部分結合,完成了類(lèi)似于J2EE中EntityBean的功能。
  
  采用數據實(shí)體和實(shí)體控制分開(kāi)的設計方法,具有以下優(yōu)點(diǎn):
  
  · 避免了J2EE體系中操縱EntityBean系統資源消耗大,效率低下的缺陷。
  
  · 解決了J2EE體系中使用EntityBean傳輸數據時(shí)開(kāi)銷(xiāo)大,過(guò)程復雜、效率低的缺陷。
  
  · 可以單獨修改實(shí)體結構和對實(shí)體數據的操縱,使得系統更加靈活
  
  · 數據實(shí)體的XML定義文件和實(shí)體控制層的類(lèi)可以通過(guò)工具自動(dòng)生成,減輕開(kāi)發(fā)工作量。
  
  數據訪(fǎng)問(wèn)層
  
  為了為實(shí)體控制層提供對數據庫操作的服務(wù),我們設計了這個(gè)部分。這個(gè)層次通常執行以下一些操作:
  
  · 連接數據庫
  
  · 執行數據庫操作
  
  · 查詢(xún)數據庫,返回結果
  
  · 維護數據庫連接緩存
  
  · 數據庫事務(wù)調用
  
   為了統一對數據的訪(fǎng)問(wèn)方式,我們在設計的時(shí)候,在框架的類(lèi)庫中包含了數據訪(fǎng)問(wèn)服務(wù),封裝了常用的對各種數據庫的操作,可以訪(fǎng)問(wèn)不同類(lèi)型的數據庫,這樣,在具體軟件系統開(kāi)發(fā)的時(shí)候,可以不用考慮同數據庫的連接等問(wèn)題,也使得應用系統在更換數據庫時(shí),不用修改原有的代碼,大大簡(jiǎn)化了開(kāi)發(fā)和部署工作。數據訪(fǎng)問(wèn)服務(wù)還維護數據庫連接緩存,提高系統性能,以及對數據庫事務(wù)調用的服務(wù)。
  
  數據訪(fǎng)問(wèn)服務(wù)在核心類(lèi)庫中主要通過(guò)DBCommon類(lèi)來(lái)提供對數據訪(fǎng)問(wèn)功能調用的服務(wù)。DBCommon的使用方法在上面的ProductEntityDAO中可以看出一二。更多的可以看看Demo工程中的使用。
  
  業(yè)務(wù)規則層
  
   業(yè)務(wù)規則層需要完成的功能是各種業(yè)務(wù)規則和邏輯的實(shí)現。業(yè)務(wù)規則完成如客戶(hù)帳戶(hù)和書(shū)籍訂單的驗證這樣的任務(wù)。這是整個(gè)應用系統中最為復雜的部分,沒(méi)有太多的規律可循。但是,我們在完成上面的工作后,對于這個(gè)部分的開(kāi)發(fā),也可以起到一定的簡(jiǎn)化的工作。這從下面的例子可以看到。
  
  業(yè)務(wù)規則層的設計通常需要進(jìn)行很好的建模工作。業(yè)務(wù)規則的建模,一般采用UML來(lái)進(jìn)行??梢允褂肬ML的序列圖、狀態(tài)圖、活動(dòng)圖等來(lái)為業(yè)務(wù)規則建模。這個(gè)部分的工作,通常通過(guò)一系列的類(lèi)之間的交互來(lái)完成。
  
  業(yè)務(wù)規則通常要求系統能夠支持事務(wù)處理(Transaction)。在這個(gè)地方,.Net提供了很方便的調用WindowsTransaction Server的手段。關(guān)于這個(gè)部分的內容,各位自己閱讀MSDN就非常清楚了,這里就不做詳細的介紹了。 虛擬主機
   
  例如,在一個(gè)庫存系統的入庫單入庫操作中,除了需要保存入庫單外,在這個(gè)之前,還必須對入庫單涉及的產(chǎn)品的數量進(jìn)行修改,其代碼通常如下(使用了事務(wù)處理):
  
  
  public void StoreIntoWarehouse(EntityData IndepotForm)
   {
   DataTable tbl=IndepotForm.Tables["InDepotFormDetail"];
   try
   {
   ProductEntityDAO ped=new ProductEntityDAO();
   for(int i=0;i<tbl.Rows.Count;i++)
   {
   DataRow formdetail=tbl.Rows[i];
   string productID=formdetail["ProductID"].ToString();
   decimal
  inCount=(decimal)formdetail["InCount"];
   EntityData product=ped.FindByPrimaryKey(productID);
   DataRow productRow=product.GetRecord("Product");
  productRow["CurrentCount"]=(decimal)productRow["CurrentCount"]+inCount;
   ped.UpdateEntity(product);
   }
   ped.Dispose();
   InDepotFormEntityDAO inDepotForm=new
  InDepotFormEntityDAO();
   inDepotForm.InsertEntity(IndepotForm);
   IndepotForm.Dispose();
   ContextUtil.SetComplete();
   }
   catch(Exception ee)
   {
   ContextUtil.SetAbort();
   throw ee;
   }
   }
  
  
  
  
   
  
  業(yè)務(wù)外觀(guān)層
  
  業(yè)務(wù)外觀(guān)層為 Web 層提供處理、瀏覽和操作的界面。業(yè)務(wù)外觀(guān)層用作隔離層,它將用戶(hù)界面與各種業(yè)務(wù)功能的實(shí)現隔離開(kāi)來(lái)。 虛擬主機
   
  業(yè)務(wù)外觀(guān)層只是將已經(jīng)完成的系統功能,根據各個(gè)模塊的需要,對業(yè)務(wù)規則進(jìn)行高層次的封裝。
  
  框架沒(méi)有規定采用在業(yè)務(wù)外觀(guān)層采用何種實(shí)現方式,但是建議使用Web Service來(lái)提供服務(wù)。采用IIS為Web服務(wù)器,可以很方便的部署Web Service。
  
  · Web層
  
  Web 層為客戶(hù)端提供對應用程序的訪(fǎng)問(wèn)。Web 層由 ASP.NET Web窗體和代碼隱藏文件組成。Web窗體只是用 HTML 提供用戶(hù)操作,而代碼隱藏文件實(shí)現各種控件的事件處理。
  
  通常,對于數據維護類(lèi)型的ASP.NETWeb 窗體和控件事件處理代碼,我們提供了工具來(lái)生成,減輕開(kāi)發(fā)工作量。
  
  除了上述6個(gè)邏輯層以外,系統通常還包括一個(gè)系統配置項目,提供應用程序配置和跟蹤類(lèi)。
  
  框架服務(wù)的設計策略
  
  為了能夠很好的支持上面所述的系統架構,我們需要一套核心的類(lèi)庫,以實(shí)現對構筑其上的應用軟件的支持。這樣,在具體每個(gè)應用系統的開(kāi)發(fā)時(shí),可以省略很多基礎性的工作,提高開(kāi)發(fā)的效率。在這個(gè)方面,我們設計了以下核心類(lèi)和接口:
  
  · EntityData:定義實(shí)體類(lèi)的通用結構
  
  · IClassBuilder:定義實(shí)體類(lèi)結構構造的結構。我們預定義了根據這個(gè)接口實(shí)現的幾個(gè)標準類(lèi):AbstractClassBuilder、 SingletableClassBuilder、ThickClassBuilder、StandardClassBuilder。這些Builder 通過(guò)ClassBuilderFactory進(jìn)行管理。
  
  · IEntityDAO:定義實(shí)體控制類(lèi)的接口
  
  · EntityDataManager:提供對所有實(shí)體類(lèi)的緩存管理和查找服務(wù)
  
  · DBCommon:封裝數據庫操作
  
  · ApplicationConfiguration:記錄系統配置
  
  · SqlManager:管理系統的SQL語(yǔ)句及其參數。
  
  通過(guò)這些核心的類(lèi)和接口,框架能夠為應用系統提供如下服務(wù):
  
  · O-R Map:對象-關(guān)系數據庫映射服務(wù)
  
  這部分完成應用程序中的實(shí)體對象同關(guān)系型數據庫的映射,主要為數據實(shí)體層提供服務(wù)。
  
   在這個(gè)部分中,定義了JIXML實(shí)體-對象映射語(yǔ)言。這是我們開(kāi)發(fā)的一種使用XML來(lái)描述對象-實(shí)體間的映射關(guān)系的規范語(yǔ)言,開(kāi)發(fā)者可以使用它來(lái)描述對象 -實(shí)體間的映射關(guān)系。開(kāi)發(fā)者也可以直接擴展IClassBuilder接口,手工完成對象-實(shí)體間映射關(guān)系的代碼。系統在運行時(shí)刻,會(huì )根據配置文件的設 置,調用實(shí)體類(lèi)的構造器,動(dòng)態(tài)構造出實(shí)體對象的結構。虛擬主機 
   
  · Database Access:數據庫訪(fǎng)問(wèn)服務(wù)
  
  這個(gè)部分提供對數據庫訪(fǎng)問(wèn)的服務(wù)。在這個(gè)框架上構建的應用軟件系統,不直接操縱數據庫,而是通過(guò)類(lèi)庫提供的數據訪(fǎng)問(wèn)服務(wù)來(lái)進(jìn)行。數據庫訪(fǎng)問(wèn)服務(wù)作為應用程序同數據庫之間的中介者,能夠有效防止對數據庫的不安全操作。
  
  數據庫訪(fǎng)問(wèn)服務(wù)同時(shí)提供了對數據庫庫事務(wù)處理的調用方法,開(kāi)發(fā)者可以很方便的通過(guò)數據庫訪(fǎng)問(wèn)服務(wù)調用數據庫的事務(wù)處理功能。
  
  · DML Search:數據操縱語(yǔ)句查詢(xún)服務(wù)
  
   在系統架構中,對數據庫進(jìn)行操作的SQL語(yǔ)句不在程序中硬編碼,而是同數據實(shí)體層的實(shí)體類(lèi)結構一樣在XML文件中描述,其結構符合JIXML規范。這些操 縱語(yǔ)句中的基本部分,如數據的插入、刪除、修改、查詢(xún)等語(yǔ)句,可以通過(guò)我們自己開(kāi)發(fā)的工具生成。這樣,在系統的便于修改性和靈活性上能夠得到很大的提高。這樣一來(lái),系統必須提供這些數據操縱語(yǔ)句的查詢(xún)服務(wù)。核心類(lèi)庫提供了在XML文件中查找這些數據操縱語(yǔ)句和相關(guān)參數的服務(wù)。
  
  · Entity Buffer&Search:實(shí)體對象緩存&查找服務(wù)
  
   系統中的實(shí)體對象在第一次創(chuàng )建后,就被系統緩存起來(lái),當系統第二次需要訪(fǎng)問(wèn)該對象時(shí),不需要再從頭創(chuàng )建這個(gè)對象,而只需要從緩存中取出即可。這就是框架提供的實(shí)體對象緩存服務(wù)。同這個(gè)服務(wù)相關(guān)聯(lián)的是實(shí)體對象的查找服務(wù),即從這些緩存的實(shí)體對象中尋找相應的實(shí)體對象的服務(wù)。
  
  · Transaction:事務(wù)處理服務(wù)
  
  我們充分利用WindowsCOM+事務(wù)處理機制的強大功能,使在應用程序能夠充分使用事務(wù)處理的功能,保證應用系統的穩定性和可靠性。
  
   當某個(gè)類(lèi)需要使用事務(wù)處理功能時(shí),首先使該類(lèi)繼承System.EnterpriseServices名稱(chēng)空間下的ServicedComponent 類(lèi),然后使用如下方式申明該類(lèi)使用的事務(wù)類(lèi)型:[Transaction(TransactionOption.Required)]。系統在該類(lèi)第一次 被調用時(shí),自動(dòng)在COM+服務(wù)中注冊中該類(lèi),使得應用程序可以使用COM+的事務(wù)處理功能。
  
  系統支持如下幾種事務(wù)處理類(lèi)型:
  
  
  成員名稱(chēng) 說(shuō)明
  Disabled 忽略當前上下文中的任何事務(wù)。
  NotSupported 使用非受控事務(wù)在上下文中創(chuàng )建組件。
  Required 如果事務(wù)存在則共享事務(wù),并且如有必要則創(chuàng )建新事務(wù)。
  RequiresNew 使用新事務(wù)創(chuàng )建組件,而與當前上下文的狀態(tài)無(wú)關(guān)。
  Supported 如果事務(wù)存在,則共享該事務(wù)。
  
  
  
  同時(shí),為了簡(jiǎn)化開(kāi)發(fā),我們還為這個(gè)框架設計了一個(gè)開(kāi)發(fā)工具,并且作為插件集成到VS.Net的開(kāi)發(fā)環(huán)境中,能夠大大減少開(kāi)發(fā)的代碼編寫(xiě)工作量。
  
  這樣,通過(guò)以上這些工作,我們達到了以下目標:
  
  · 有了一個(gè)非常清晰的系統架構 虛擬主機
   
  · 因為有了一套核心的類(lèi)庫來(lái)為應用系統提供服務(wù),使得我們在后面的開(kāi)發(fā)過(guò)程中可以減少很多基礎性的工作
  
  · 有了自己的有針對性的開(kāi)發(fā)工具,能夠減少大量的重復編碼的工作。
  
  為了讀者能夠更好的了解系統的結構,附上一個(gè)Demo工程(下載Demo工程)。這是一個(gè)簡(jiǎn)單的倉庫入庫的示例,基本上展示了這個(gè)框架的應用系統的結構和核心類(lèi)庫的使用。
  
  不得不看得實(shí)戰內容:利用.Net框架開(kāi)發(fā)應用系統
  
  作者簡(jiǎn)介:孫亞民,1998年畢業(yè)于南京大學(xué),現任蘇州迪訊軟件開(kāi)發(fā)有限公司技術(shù)總監,熟悉J2EE架構、.Net以及C#語(yǔ)言。 


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
實(shí)體框架簡(jiǎn)介
OFBIZ2.0精簡(jiǎn)版本應用概論
bean、javabean、entity、dto、ejb、pojo都是些什么鬼
《Entity Framework 實(shí)用精要》 - 學(xué)習筆記
LINQ 默認欄目 默認欄目 語(yǔ)錄點(diǎn)滴
luoxq39 如何:使用 ADO.NET 實(shí)體框架數據源創(chuàng )建數據服務(wù)(WCF 數據服務(wù))
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久