Microsoft ObjectSpaces
这是一个在几年前就让众多NET guy伸长脖子激动不已的技术就作者来说那个时候只要一提起这个话题一般都是在JEE guy的嘲笑声中悻悻而归恨不能自己也搞个ENB(相对EJB)或者NCMP(相对CMP)什么的
终于我们可以在NET Framework (可在VSNET Whidbey或Yukon中找到目前都是Beta版本)中一睹其芳容了J
首先让我们看看用ObjectSpaces写出的代码是什么样子(依然使用上面的employee例子)
// 初始化ObjectSpace
SqlConnection conn = new SqlConnection(Data Source=localhost;
Integrated Security=SSPI; Database=Northwind);
ObjectSpace os = new ObjectSpace(mapxml conn);
// 根据EmployeeID返回其Title
Employee oEmp = (Employee)osGetObject (
new ObjectQuery(typeof(Employee) ID = ));
// 注意实际字段名为EmployeeID
string strTitle = oEmpTitle;
……
// 根据 City 返回所有符合条件的 Employee
ObjectSet oSet = osGetObjectSet(
new ObjectQuery(typeof(Employee) City = Seattle));
// 注意返回的不是DataTable而是对象集合
foreach (Employee oEmp in oSet)
{
…… // 注意在这里可以对oEmp做任何操作
}
针对上面第二段代码还有一种解决方案就是以ObjectReader替代ObjectSet这其中所包含的差异类似于ADONET (包含ObjectSpacesd的ADONET又称为ADONET )中的DataSet / DataTable与DataReader间的不同(不得不佩服Microsoft在前后一致性上表现出的老谋深算J)
仔细分析上面的代码就可以发现它和前面讨论的OJB有惊人的相似点(OJB中作者只画了基本类图但足可看出这种思想上的接近)!
例如ObjectSpace类基本上提供了OJB中的QueryFacade功能ObjectQuery类基本上提供了OJB中的Criteria功能同时两种解决方案又不约而同的使用了配置文件来存储O/R Mapping信息而应用程序一般也就通过这个类进行数据操作非常方便稍微有些区别的可能是在数据返回格式上(这一点ObjectSpaces考虑得更细致可以参考上面的代码)但这已经对实际的代码实现影响不大了
如果将ObjectSpaces下的调用代码与前面给出的那段在ADONET下撰写的代码作个比较不难看出ObjectSpaces给出的代码更易阅读和理解就算不熟悉ADONET整体架构的开发人员也可轻松上手(唯一涉及RDBMS的代码只有建立数据库连接时需要)对于已经熟悉ADONET或曾接触过O/R Mapping(如JEE下的Hibernate)的朋友来说真可谓小菜一碟!
从NET Framework 文档中可以知道ObjectSpaces总共提供了个命名空间整体结构非常清晰
SystemDataObjectSpaces
SystemDataObjectSpacesQuery
SystemDataObjectSpacesSchema
ObjectSpacesQuery已在上面的代码中见识过从名字中可以猜出它们主要负责向外提供基本访问接口(如查询增 / 删 / 改等)和解析各种查询条件(如对象过滤等)Schema命名空间则主要用来操作O/R Mapping配置文件并为其它两个命名空间中的类提供服务
在ObjectSpaces中O/R Mapping配置文件主要指mapxml这个文件的名字是可以随意更换的比较类似OJB中的repositoryxml另外两个分别描述数据库结构和对象结构的配置文件也非常重要RSDxml(Relational Schema Definition)OSDxml(Object Schema Definition)可以将它们理解为Typed DataSet中的XSD文件没有它们所有的数据 / 对象Mapping和Validation都将是非法的J!
本文中作者不准备对ObjectSpaces来个深度探索也不会提供什么Sample说明其优越性这方面NET Framework SDK早已为大家提供了丰富套餐
作者只是希望如果从DAL的角度来分析ObjectSpaces技术能为我们带来什么是否意味着从此告别DataReader / DataSet抑或为开发人员带来了新的烦恼?
好处不多说仅举数例即可明了
()ObjectSpaces全部采用对象方式访问数据大大缓解了很多开发人员的SQL(或者说RDBMS)恐惧症
()对于比较简单的数据库结构变化只需要修改配置文件即可无需重新编译代码(较之OPF中将映射关系以NET Attribute方式封装于代码中显得更加灵活方便)
()对于比较复杂的数据库结构变化由于只涉及对象操作所以修改的工作也要比以前简单许多
()采用了O/R Mapping配置文件后数据库设计与DAL开发可以分别进行相互的影响也降到了最低点
不足则是我们更须关注的话题
()目前版本不支持中文(永远的话题J)查询不爽!
()当前版本仅支持SQL Server 以上版本的数据库系统弱(这是个很耐人寻味的限制有兴趣的读者不妨想想到底是什么原因)!
(引自NET Framework SDK Document就这两点已排除了很多跃跃欲试的朋友而作者参与的NET项目虽不受影响但由于经常使用Oracle就不得不暂时忍痛割爱了J)
()性能问题虽然ObjectSpaces也提供了类似DataReader的功能(ObjectReader)但毕竟需要进行一次数据强类型填充无论如何会有损失如果返回数据量变大将是一个不得不考虑的问题
()还是性能问题mapxml是个好东东但如何优化对它的访问以及进行正确的Validation(基于RSDxmlOSDxml)毕竟需要时间甚至在某些时候(数据库结构比较复杂)这会造成比第点更为严重的后果