可以看出,整个业务实例被封装到一个单独的方法中。BookHolidayFor方法处理许多责任,如数据检索和持久化,以及用来确定是否可以休假的业务逻辑。这种过程式编程风格违背了面向对象编程的基本理念。如果逻辑始终非常简单、应用程序较小且易于管理,那么该方式没有问题。
如果应用程序较小,而且业务逻辑简单,不需要采用完全的面向对象方法,Transaction Script模式可能比较合适。但是,如果应用程序规模会变大,那就可能需要重新考虑业务逻辑结构并寻求更具伸缩性的模式,如Active Record模式,这正是4.1.2小节的主题。
4.1.2 Active Record
Active Record模式是一种流行的模式,尤其在底层数据库模型匹配业务模型时它特别有效。通常,数据库中的每张表都对应一个业务对象。业务对象表示表中的一行,并且包含数据、行为以及持久化该对象的工具,此外还有添加新实例和查找对象集合所需的方法。图4-2展示一个博客应用程序中的Post和Comment对象如何与它们对应的数据库表关联起来。该图还说明Post中含有一个Comment对象集合。
在Active Record模式中,每个业务对象均负责自己的持久化和相关的业务逻辑。
Active Record模式非常适用于在数据模型和业务模型之间具有一对一映射关系的简单应用程序,如博客或论坛引擎。如果已经有数据库模型或者希望采用“数据优先”的方法来构建应用程序,这也是一个可用的好模式。因为业务对象与数据库中的表具有一对一映射关系,而且均具有相同的创建、读取、更新和删除(CRUD)方法,所以可以使用代码生成工具自动生成业务模型。优秀的代码生成工具还会内置所有的数据库验证逻辑,以确保只有有效的数据才会持久化。在第7章中讨论如何持久化业务对象时将研究业务对象自动化生成以及使用Active Record模式的框架。与Transaction Script模式一样,Active Record模式也非常简单而且易于掌握。
Active Record模式随着基于数据库的Web应用程序而流行,其中一个典型就是结合了MVC模式(第8章)和Active Record ORM(第7章)的Ruby on Rails框架。在.NET领域,构建在NHibernate(第7章)之上的Castle ActiveRecord项目是最流行的开放源代码Active Record框架之一,本书将使用该项目以及ASP.NET MVC应用程序来构建一个简单的博客网站。因为博客网站只包含少量的业务逻辑,因此在业务对象和数据模型之间存在较好的相关性,Active Record模式此时就是一个很好的选择。