技术开发 频道

重建IBuySpy数据访问层

  根据参数返回一个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框架的问题)。

0
相关文章