ActiveRecord适用于:
1. 业务逻辑比较简单;当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即你的业务逻辑大多数是对单表操作;
2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script), 把跨表事务提升到事务脚本中;
3. ActiveRecord最大优点是简单, 直观; 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了;
4. 这些优点使ActiveRecord特别适合web快速开发, 而正是快速开发框架ROR采用了ActiveRecord, 并且很多类ROR框架如Castle的纷纷效仿才使ActiveRecord重新进入大家视线;
我想这也是为什么Martin Fowler在PoEAA中早就提出了这个模式, 但是直到最近两三年ActiveRecord才热起来可能就是这个原因;
ActiveRecord不适合于
1. ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中. 如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 你就要考虑Domain Model + O/R Mapper了;
2. ActiveRecord保存了数据, 使它有时候看上去像数据传输对象(DTO). 但是ActiveRecord有数据库访问能力, 不要把它当DTO用. 尤其在跨越进程边界调用的时候, 不能传递ActiveRecord对象;
这个模式的技术架构:
UI(Form/Web网页):数据展示, 有控件, 或者完全的HTML标签, Jsp中还有EL
Datasource:数据提供者,提供给页面控件(元素)展示数据, Net有 SQLDatasource,ObjectDatasource
Java有 JSP 对应的<jsp:bean>, <jsp:setProperty>, <jsp:getProperty> 等标签
Zen框架中 QuerySource
BO:业务逻辑层, 实现:业务逻辑与算法,Entity类业务逻辑方法,数据验证, 生成DTO层对象等功能,
业务逻辑与Datasource之间的DTO层, 用来传输数据,这些数据可能是表、视图或者综合的一个POJO,对于简单数据可以与Entity共用一个类。
Entity层: 类与数据库之间的映射层, 对应的关系型数据库, 保存数据时转换成SQL语句, 对应Cache数据库使用它自己的代理方法
ActiveRecord: 技术框架层, 所有的Entity都继承此层的基类;本基类中包含了数据操作方法,封装了部分业务逻辑
对应的产品: Net Castle的 ActiveRecord框架, Cache数据库的Persistent类的数据存储框架,