当前位置:中国站长下载文章中心网页编程.NET编程 → 用ObjectSpaces重建IBuySpy的数据访问层

用ObjectSpaces重建IBuySpy的数据访问层

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 9:57:59
     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;
  
  

[1] [2]  下一页