熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

用ObjectSpaces重建IBuySpy的數據訪問層

2013-11-15 12:53:52  來源: ASP編程 

  ObjectSpaces這個ORM框架可能已經被大家聽過N次了它誕生很早但開發周期拖了很長雖然很早它的測試版本就已經有人使用了但只到Net Framework 才計劃正式將它包含其中並放在了ObjectDataObjectSpaces這個NameSpace中
  
   ObjectSpaces的流傳版本也是甚多被很多人研究過的一個EAP(Early Adopter Preview)版的版本號是我在裡面看過一個的版本做的東西這裡用的這個ObjectSpaces是現在大家普遍使用的Net Framework Alpha測試版裡面帶的版本號同Net Framework保持一致  
   
   從版本號的變更就可以看出ObjectSpaces從開始到現在變化很大上面提到的三個版本都各有差別而且差別不小現在最新的這個版本我想應該和最終版本差別不會很大了我以前的一篇文章就是基於EAP版本的比現在的簡單不少 
   
   進入正題在IBuySpy的架構中實際上是沒有BLL(商業邏輯層)的甚至沒有創建Entity Class數據通過DAL(數據訪問層)從數據庫中獲得然後將DataSet或者DataReader直接從DAL傳遞給構成IBuySpy頁面的Module的ascx文件再直接綁定到DataList之類的web control上 
   
   我們這裡將IBuySpy的Announcement模塊的DAL用ObjectSpaces重新寫過 
   
先來看看IBuySpy原來的Announcements模塊 
   
   DALAnnouncementsDBcs文件
  
   界面控件頁面用於顯示的Announcementsascx控件和用於新增修改的EditAnnouncementsaspx頁面 
   
   裡面都是最最標准的寫法沒什麼講的 

Entity Class 
   
   新創建一個Announcement類和一個AnnouncementCollection集合類也沒什麼講的 
   
建立ObjectSpaces的RSDOSDMSD 
   
   ObjectSpaces的核心就是用來描述Schema的三個xml文件
  
   一個描述數據庫表結構的Relational Schema Definition一個描述實體類結構的Object Schema Definition和一個描述表結構和實體類映射關系的Mapping Schema Definition
  
   用ObjectSpace最主要(也是最煩人)的工作就是把這三個Schema寫出來EAP版裡面還只有一個xml文件要寫現在要寫三個了L
   
   AnnouncementRSDxml
  
   AnnouncementOSDxml
  
   AnnouncementMSDxml 
   
重寫DAL 
   
   創建一個新的類文件AnnouncementOSDBcs包含一個新的類AnnouncementOSDB裡面的方法簽名對照著IBuySpy原本的AnnouncementDB類就行了原本的AnnouncementDB是用ADONET返回DataSetDataReader我們的AnnouncementOSDB就用ObjectSpaces返回實體集合類或實體類 
   
   根據moduleId返回Announcement集合
  
   public AnnouncementCollection GetAnnouncements(int moduleId)
  
   {
  
   ObjectSpace os = new ObjectSpace(_sMapFilePath _conn);
  
   // 條件是ModuleID等於參數moduleIdExpireDate大於當前時間
  
   ObjectQuery query = new ObjectQuery(typeof(Announcement) ModuleID = + moduleIdToString() + and ExpireDate > # + DateTimeNowToString() + #);
  
   // 取數據
  
   ObjectReader reader = osGetObjectReader(query); 
   
   AnnouncementCollection result = new AnnouncementCollection();
  
   // 從ObjectReader中取值不需要另外造型
  
   foreach (Announcement ann in reader)
  
   {
  
   resultAdd(ann);
  
   } 
   
   return result;
  
   } 
   
   根據參數返回一個Announcement
  
   public Announcement GetSingleAnnouncement(int itemId)
  
   {
  
   ObjectSpace os = new ObjectSpace(_sMapFilePath _conn);
  
   ObjectQuery query = new ObjectQuery(typeof(Announcement) ItemID = + itemIdToString());
  
   return (Announcement) osGetObject(query);
  
   } 
   

  [NextPage]

  根據參數刪除一個Announcement:
  
   public void DeleteAnnouncement(int itemId)
  
   {
  
   ObjectSpace os = new ObjectSpace(_sMapFilePath _conn);
  
   ObjectQuery query = new ObjectQuery(typeof(Announcement) ItemID = + itemIdToString());
  
   Announcement ann = (Announcement) osGetObject(query);
  
   osMarkForDeletion(ann);
  
   osPersistChanges(ann);
  
   } 
   
   新增一個Announcement
  
   public void AddAnnouncement(int moduleId int itemId String userName String title DateTime expireDate String description String moreLink String mobileMoreLink)
  
   {
  
   Announcement ann = new Announcement();
  
   annSetModuleID(moduleId);
  
   annSetItemID();
  
   annCreatedByUser = userName;
  
   annCreatedDate = DateTimeNow;
  
   … 
   
   ObjectSpace os = new ObjectSpace(_sMapFilePath _conn);
  
   osStartTracking(ann InitialStateInserted);
  
   osPersistChanges(ann);
  
   } 
   
   修改一個Announcement
  
   public void UpdateAnnouncement(int moduleId int itemId String userName String title DateTime expireDate String description String moreLink String mobileMoreLink)
  
   {
  
   ObjectSpace os = new ObjectSpace(_sMapFilePath _conn);
  
   ObjectQuery query = new ObjectQuery(typeof(Announcement) ItemID = + itemIdToString());
  
   Announcement ann = (Announcement) osGetObject(query); 
   
   annCreatedByUser = userName;
  
   annTitle = title;
  
   … 
   osPersistChanges(ann);
  
   } 
   
最後修改界面層 
   
   原本界面層是把AnnouncementDB返回的DataSet綁定到Web Control上只要改成將AnnouncementOSDB返回的實體集合類綁定到Web Control上就可以了改動量很少很少 

   比如
  
   原本將數據取出並綁定的代碼(在Announcemenetsascxcs中)
  
   AnnouncementsDB announcements = new AnnouncementsDB();
  
   myDataListDataSource = announcementsGetAnnouncements(ModuleId);
  
   myDataListDataBind();
  
   只要將第一句改成
  
   AnnouncementOSDB announcements = new AnnouncementOSDB();
  
   實際上就是改從哪個DAL取數據就OK了 
   
講講ObjectSpaces 
   
   ObjectSpaces的架構是這樣的
  
   ObjectSpace類管理數據映射它負責(隱形的通過ObjectEngine)從數據源(IDbConnection或者ObjectSources)取數據和將數據更新回數據源(更新時會自動隱形啟用Transaction)它通過ObjectSpaceGetObject()返回單個對象通過ObjectSpaceGetObjectSet()返回ObjectSet對象(這個對象類似於DataSet表示一組數據對象)通過ObjectSpaceGetObjectReader()返回ObjectReader對象(這個對象類似於DataReader是一個快速的forwardonly的數據對象讀取器)它通過內含的ObjectContext來維護數據對象的原始值和監視數據對象的值的修改 
   
   我上面的代碼演示目的是為了展示ObjectSpaces並沒有完整的給IBuySpy加一個BLL我也沒有演示數據之間的RelationsObjectSpaces可以支持非常豐富的RelationsOneToOneManyToManyOneToMany等等而且也提供了LazyLoading(在真正需要使用Relation的數據的時候才真正去取這些數據) 
   
   不過如果你也試著用ObjectSpaces來重建你的項目中的DAL我不知道你的感覺會不會和我一樣那就是比現在更麻煩…比如不支持存儲過程(難道支持而文檔裡面不提一句嗎?EAP版本還支持的)手工寫RSDOSDMSD太繁瑣了(PDC上出現過一個Mapper Utility希望Whidbey會提供自動化工具)靈活性降低不少(所有ORM框架的問題)
  
   Kaneboys blog :


From:http://tw.wingwit.com/Article/program/ASP/201311/21831.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.