.NET挑战J2EE域对象
【IT168 专稿】编者按:关于J2EE与.Net的争论中,在这场势均力敌的战斗中,一直没有一个真正胜利者,因为他们都有自已的绝杀武器和致命的命门。所以到底是孰是孰非,我们也不好下这个结论,那么我们就从域对象上来看谁是这个领域的胜者?
企业域建模是J2EE的传统强项。正如我们在很多文章里看到的,J2EE的设计受很多方面的影响,其中诸如MVC的体系机构模式和像CORBA一样的企业对象分布式技术,因此这个框架从诞生的时候就具有内置的支持。
由于.NET是在微软的Visual API基础上建立起来的,其重点是组件让应用程序“可视”。随着时间的过去,微软开始意识到自已的不足,也开发了比较强大的企业体系结构实践,同时也更倾向于企业特定领域的服务,因此在这个区域,.NET的出现着实给了J2EE重重的一击。
什么叫域对象
还好EJB3.0以及更多开源域对象的出现,让J2EE伤口得以迅速的复元,但是今天我们要这场对攻战中,必须要决出谁才是这个领域的王者,在进行两者之间比较之前,我们先了解一下概念,就是什么是域对象,域对象就是一种理论表示术语,用于描述任何代表真实事务实体的对象,诸如订单、条款、帐号等等。而且当说起域模型的时候,人们通常会联想到实体相关的服务,例如数据库持久性、生命周期管理等。和许多其他的面向对象的概念一样,很难给域对象下一个清晰完整的定义。从某种意义上说,域对象就是可以被计算机操作的所有事情。
J2EE中的特定域对象
在J2EE规范中,有90%的API以不同形式,都与某些域模型服务有关,其中最著名(也是质疑声最强的)的典型例子就是EJB这个庞然大物。
还有就是数据连接规范(JDBC),目录综合服务(JNDI),Java事务处理API(JTA),远程调用API(RMI)等等,但是,更为重要的是两个开源框架,它与Hibernate和Spring造就了如今的J2EE域对象模式,也是现在比较流行组合型域对象模式(Hibernate,Spring)。
Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑他们如何从数据库表中进行存取,解决Java操作数据方面的先天不足。
Spring是一个可以解决许多在J2EE开发中常见的问题的强大框架,同时也提供了管理业务对象的一致方法,Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。
当Spring与Hibernate联合使用的时候,号称是当今最流行轻型架构,这也是J2EE最独特的域对象模式,它抛弃了EJB的雍肿,同时又保留了J2EE中优点。
在.NET中对域对象的支持
在.NET中对特定领域对象的支持不像在J2EE中那么完善,不过这并不完全是一件坏事,在某些方面J2EE的设计过于复杂了。
在我看来,.NET的做法实际上非常好,它让开发者不用关心更多相关的体系结构细节问题,包括.NET中需要更少的处理.XML文件、更少的配置文件和目录引用等等,在.NET中关键的API就是ADO.NET,这点与Java中的JDBC非常相似。
在.NET中惟一感觉到不足的是,.Net与其他厂商的产品配合使用时,API的标准化没有很好的设计。例如当你进行对Oracle数据库访问的编程的时候,使用的是对象而不是接口,因此你写代码的时候不得不使用“生硬的绑定”。在JDBC中,我们通常是针对接口编写代码,从来不会捆绑到任何特定厂商的对象上。我非常惊讶,ADO.NET的设计者竟然没有考虑到遵循接口设计的隔离原则。
在对象关系持久化方面,有一个专门为.NET设计的Hibernate版本,通常被称作NHibernate。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。
这个产品的起步很晚,而且已严重落后主流Java的Hibernate版本。NHibernate目前是基于Hibernate 2,但是现在Hibernat的主流版本是3.1。这使得两者的功能具有很大的差别。这个项目在社区活跃性还远远不够,与Hibernate相比,受到人们的关注度还非常低,不知道是什么原因,似乎.NET开发者并不是很在乎如此强大的对象关系框架。
在NHibernate出现之前,微软也在考虑这方面的问题,微软曾经试图推出它自己的对象关系工具-ObjectSpaces,但是由于某些原因一直没有推出。我查阅了该规范的早期版本,感觉它与当代的对象关系解决方案非常相似,我感觉ObjectSpace将在微软下一代的微软操作系统中将出现,但是很多人不看好微软的对象关系工具,微软也认为它是一个可有可无的东西吧,没有全力来推广它,但是如果微软在方面发力的话,J2EE可能也就只有招架之功了。
最后,在.NET 2.0中一个非常优秀的功能是它的缓存机制,缓存机制是唯一一个最重要、最具有价值的、为高负载应用程序所增加的功能,如果对其应用得当,它可以成为得心应手的工具,J2EE已经通过开源支持或商业插件具备缓存机制,而.NET也对其进行了支持。相比之下,我更喜欢.NET的内置支持,尽管它可能不像在.J2EE中的某些插件那么强大,但是它也可以干净利落的完成属于它的任务。
总结
微软公司当初没有想到域对象模式,会占领这块市场,认为.Net本身的这些功能,可以解决所有问题,但是往往过于自傲的性格,却会阻碍他前进的脚步,因些.Net首先要做的是就是很好的ORM支持。
J2EE已经具备了所以域对象的功能。但是有了这些功能还是远远不够的,J2EE应该从开发的角度出发,开发出更轻便更快捷的产品来,J2EE的瘦身计划刻不容缓。
0
相关文章