国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

用ObjectSpaces重建IBuySpy的數據訪問層

2024-07-21 02:15:48
字體:
來源:轉載
供稿:網友
objectspaces這個orm框架可能已經被大家聽過n次了,它誕生很早,但開發周期拖了很長,雖然很早它的測試版本就已經有人使用了,但只到.net framework 1.2才計劃正式將它包含其中,并放在了object.data.objectspaces這個namespace中。
  
  
  
  objectspaces的流傳版本也是甚多,被很多人研究過的一個eap(early adopter preview)版的版本號是1.0.1081,我在gotdotnet.com里面看過一個1.0.3328.4的版本做的東西,這里用的這個objectspaces是現在大家普遍使用的.net framework 1.2 alpha測試版里面帶的,版本號同.net framework保持一致,1.2.30703.27。
  
  
  
  從版本號的變更就可以看出,objectspaces從開始到現在變化很大。上面提到的三個版本都各有差別,而且差別不小。現在最新的這個版本我想應該和最終版本差別不會很大了。我以前的一篇文章就是基于eap版本的,比現在的簡單不少。
  
  
  
  進入正題:在ibuyspy的架構中,實際上是沒有bll(商業邏輯層)的,甚至沒有創建entity class,數據通過dal(數據訪問層)從數據庫中獲得,然后將dataset或者datareader直接從dal傳遞給構成ibuyspy頁面的module的ascx文件,再直接綁定到datalist之類的web control上。
  
  
  
  我們這里將ibuyspy的announcement模塊的dal用objectspaces重新寫過:
  
  
  
  一、先來看看ibuyspy原來的announcements模塊
  
  
  
  dal:announcementsdb.cs文件
  
  界面控件頁面:用于顯示的announcements.ascx控件和用于新增修改的editannouncements.aspx頁面
  
  
  
  里面都是最最標準的寫法,沒什么講的。
  
  
  
  二、entity class
  
  
  
  新創建一個announcement類和一個announcementcollection集合類,也沒什么講的。
  
  
  
  三、建立objectspaces的rsd、osd、msd
  
  
  
  objectspaces的核心就是用來描述schema的三個xml文件:
  
  一個描述數據庫表結構的relational schema definition,一個描述實體類結構的object schema definition,和一個描述表結構和實體類映射關系的mapping schema definition。
  
  用objectspace最主要(也是最煩人)的工作就是把這三個schema寫出來。eap版里面還只有一個xml文件要寫,現在要寫三個了l。
  
  
  
  announcementrsd.xml
  
  announcementosd.xml
  
  announcementmsd.xml
  
  
  
  四、重寫dal
  
  
  
  創建一個新的類文件announcementosdb.cs,包含一個新的類announcementosdb,里面的方法簽名對照著ibuyspy原本的announcementdb類就行了。原本的announcementdb是用ado.net,返回dataset、datareader,我們的announcementosdb就用objectspaces,返回實體集合類或實體類。
  
  
  
  根據moduleid返回announcement集合:
  
  public announcementcollection getannouncements(int moduleid)
  
   {
  
   objectspace os = new objectspace(_smapfilepath, _conn);
  
   // 條件是moduleid等于參數moduleid,expiredate大于當前時間
  
   objectquery query = new objectquery(typeof(announcement), "moduleid = " + moduleid.tostring() + " and expiredate > #" + datetime.now.tostring() + "#");
  
   // 取數據
  
   objectreader reader = os.getobjectreader(query);
  
  
  
   announcementcollection result = new announcementcollection();
  
   // 從objectreader中取值不需要另外造型
  
   foreach (announcement ann in reader)
  
   {
  
   result.add(ann);
  
   }
  
  
  
   return result;
  
   }
  
  
  
  根據參數返回一個announcement:
  
   public announcement getsingleannouncement(int itemid)
  
   {
  
   objectspace os = new objectspace(_smapfilepath, _conn);
  
   objectquery query = new objectquery(typeof(announcement), "itemid = " + itemid.tostring());
  
   return (announcement) os.getobject(query);
  
   }
  
  
  
  根據參數刪除一個announcement:
  
   public void deleteannouncement(int itemid)
  
   {
  
   objectspace os = new objectspace(_smapfilepath, _conn);
  
   objectquery query = new objectquery(typeof(announcement), "itemid = " + itemid.tostring());
  
   announcement ann = (announcement) os.getobject(query);
  
   os.markfordeletion(ann);
  
   os.persistchanges(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();
  
   ann.setmoduleid(moduleid);
  
   ann.setitemid(-1);
  
   ann.createdbyuser = username;
  
   ann.createddate = datetime.now;
  
   …
  
  
  
   objectspace os = new objectspace(_smapfilepath, _conn);
  
   os.starttracking(ann, initialstate.inserted);
  
   os.persistchanges(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 = " + itemid.tostring());
  
   announcement ann = (announcement) os.getobject(query);
  
  
  
   ann.createdbyuser = username;
  
   ann.title = title;
  
   …
  
  
  
   os.persistchanges(ann);
  
   }
  
  
  
  五、最后修改界面層
  
  
  
  原本界面層是把announcementdb返回的dataset綁定到web control上,只要改成將announcementosdb返回的實體集合類綁定到web control上就可以了,改動量很少很少。
  
  
  
  比如:
  
  原本將數據取出并綁定的代碼(在announcemenets.ascx.cs中):
  
  announcementsdb announcements = new announcementsdb();
  
  mydatalist.datasource = announcements.getannouncements(moduleid);
  
  mydatalist.databind();
  
  只要將第一句改成:
  
  announcementosdb announcements = new announcementosdb();
  
  實際上就是改從哪個dal取數據就ok了。
  
  
  
  六、講講objectspaces
  
  
  
  objectspaces的架構是這樣的:
  
  objectspace類管理數據映射,它負責(隱形的通過objectengine)從數據源(idbconnection或者objectsources)取數據和將數據更新回數據源(更新時會自動隱形啟用transaction)。它通過objectspace.getobject()返回單個對象,通過objectspace.getobjectset()返回objectset對象(這個對象類似于dataset,表示一組數據對象),通過objectspace.getobjectreader()返回objectreader對象(這個對象類似于datareader,是一個快速的forward-only的數據對象讀取器)。它通過內含的objectcontext來維護數據對象的原始值和監視數據對象的值的修改。
  
  
  
  我上面的代碼演示目的是為了展示objectspaces,并沒有完整的給ibuyspy加一個bll。我也沒有演示數據之間的relations,objectspaces可以支持非常豐富的relations,onetoone、manytomany、onetomany等等,而且也提供了lazyloading(在真正需要使用relation的數據的時候才真正去取這些數據)。
  
  
  
  不過如果你也試著用objectspaces來重建你的項目中的dal,我不知道你的感覺會不會和我一樣,那就是“比現在更麻煩…”。比如,不支持存儲過程(難道支持而文檔里面不提一句嗎?eap版本還支持的),手工寫rsd、osd、msd太繁瑣了(pdc2003上出現過一個mapper utility,希望whidbey會提供自動化工具),靈活性降低不少(所有orm框架的問題)。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和静县| 金阳县| 佛冈县| 科技| 伊川县| 汉川市| 东城区| 商城县| 石家庄市| 泾源县| 郎溪县| 东兰县| 申扎县| 和政县| 宁乡县| 章丘市| 西和县| 唐山市| 元谋县| 垦利县| 息烽县| 武功县| 资中县| 惠州市| 上栗县| 思茅市| 德钦县| 吐鲁番市| 定结县| 鄂州市| 佛学| 开平市| 家居| 德兴市| 罗平县| 永昌县| 望谟县| 南木林县| 商洛市| 方山县| 新巴尔虎左旗|