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);
}