这里以极快的速度构建好博客应用程序,这在很大程度上要归功于Castle ActiveRecord框架,由于对象模型与数据模型之间紧密相关,它能够将数据的检索和访问操作自动化。
Active Record模式并非灵丹妙药。它擅长于处理底层数据模型能够很好映射到业务模型的情形,但是当出现不匹配时(有时候称为阻抗失配),该模式将很难应对。这是由于复杂系统的概念业务模型有时与数据模型不同所造成的。如果业务领域非常丰富,有着大量的复杂规则、逻辑和工作流,那么采用Domain Model方法将更加有利。这正是4.1.3小节中要讨论的模式。
4.1.3 Domain Model
可以将Domain Model视为表示正在处理的领域的概念层。事物以及事物之间的关系都存在于这个模型中。这里的“事物”表示什么意思呢?例如,如果正在构建一个电子商务商店,那么这个模型中的“事物”将表示购物车、订单、订单项及类似的事物。这些事物包含数据,更重要的是它们还有行为。一张订单不仅有表示创建日期、状态和订单流水号的属性;还包含应用到凭证的业务逻辑,其中包括围绕它的所有领域规则:凭证是否有效?该凭证能否用于购物车中的商品?是否存在任何其他导致该凭证失效的出价?Domain Model越能密切地表示真实的领域越好,这是因为更容易理解和复制组织中的复杂的业务逻辑、规则和验证过程。Domain Model与Active Record模式之间的主要差别在于,Domain Model中存在的业务实体并不知道如何持久化自己,而且没有必要在数据模型和业务模型之间建立一对一的映射关系。
1. POCO和PI
前面曾经提到过,Domain Model与Active Record模式不同,它不知道持久化。术语持久化不知(persistence ignorance,PI)表示普通CLR对象(plain old common runtime object,POCO)业务实体的朴实本质。那么如何将Domain Model的业务对象持久化呢?通常使用Repository模式(第7章)。采用Domain Model模式时,Repository对象以及数据映射器(第7章)负责将业务实体及相关实体的对象图映射到数据模型。
2. 代码示例
为了演示Domain Model模式,将创建一个解决方案来为银行领域建模,这涉及账号的创建以及账号之间的现金转账。
创建一个名为ASPPatterns.Chap4.DomainModel的新的解决方案,并向其中添加下面的类库项目:
● ASPPatterns.Chap4.DomainModel.Model
● ASPPatterns.Chap4.DomainModel.AppService
● ASPPatterns.Chap4.DomainModel.Repository
此外还添加一个新的Web应用程序ASPPatterns.Chap4.DomainModel.UI.Web。在Repository项目上右击,并添加对Model项目的项目引用。在AppService项目上右击,添加对Model和Repository项目的项目引用。最后,在Web项目上右击,添加对AppService项目的项目引用。