NHibernate3剖析:Mapping篇之ConfORM实战(2):原理

系列引入

NHibernate3剖析系列分别从Configuration篇、Mapping篇、Session篇、Core篇、Tool篇、Practice篇、Extension篇等方面全面揭示NHibernate3版本内容、特性及其应用,完全基于NHibernte3版本。

ConfORM概述

上一节中,我用一个简单的例子描述了ConfORM简单使用。留下了很多疑问,大家不解为何使用ConfORM以及怎么使用ConfORM,其内部原理是什么。这节,我们先注重了解一些ConfORM的原理。

你可以到http://code.google.com/p/codeconform/ 获取ConfORM

ConfORM重要接口

ConfORM的核心就是实例化一个ObjectRelationalMapper对象和Mapper对象,配置Domain对象,调用Mapper对象的CompileMappingFor()方法生成HbmMapping。即上一节中我们所写的:

//Code Snippets Copyright http://lyj.cnblogs.com/
public static HbmMapping GetMapping()
{
    //初始化ObjectRelationalMapper类
    var orm = new ObjectRelationalMapper();
    //配置Domain为TablePerClass
    orm.TablePerClass<Domain>();
    //在这里可以调用ObjectRelationalMapper类一些方法配置Domain语义
    //使用orm参数初始化Mapper类
    var mapper = new Mapper(orm);
    //在这里可以调用Mapper类一些方法配置Domain的Mapping
    //调用Mapper类的CompileMappingFor方法编译生成HbmMapping对象
    return mapper.CompileMappingFor(new[] { typeof(Domain) });
}

在了解这段代码之前,先看看ConfORM的重要接口:

IDomainInspector接口

IDomainInspector接口用来描述我们的领域模型,按照ORM术语定义。是ConfORM的切入点,同时也是Mapping类的驱动。由ObjectRelationalMapper类实现这个接口。

IObjectRelationalMapper接口

首先回顾下一些ORM术语:

面向对象的三种继承策略:

  • TablePerClass:每个类一张表映射策略
  • TablePerClassHierarchy:每个类分层结构一张表映射策略
  • TablePerConcreteClass:每个具体类一张表映射策略

在Entity模型属性中,主要有主键属性、持久化属性、非持久化属性。

IObjectRelationalMapper接口使用ORM术语来描述Domain模型,包含了三种继承策略和Entity模型的各种属性设置方法:

  • 主键(Poid):每个实体都有自己的状态和生命周期,在数据库中的记录需要一个主键来识别。
  • 持久化属性:一般有基本属性,还有版本号属性(VersionProperty)、NaturalId属性、各种集合属性(Set、Bag、List、Array、Dictionary、Complex、HeterogeneousAssociation)、各种关联关系属性(ManyToMany、ManyToOne、OneToOne)。
  • 非持久化属性:不是所有的Domain、属性都需要做持久化,当我们不需要映射类或者属性时可以使用Exclude、ExcludeProperty排除。

另外附加一个关联集合的级联方法:Cascade

IExplicitDeclarationsHolder接口

显式声明Domain语义接口,使用IObjectRelationalMapper接口方法显式声明自定义Domain语义,ConfORM会添加到相应集合中。

IPatternsHolder接口

用于隐式声明Domain语义接口,主要原理是其默认实现类(DefaultNHibernatePatternsHolder类)中在各个集合里默认定义了相匹配的模式供我们来匹配其成员。

例如:实体主键Poid默认使用PoIdPattern:如果实体成员的名称是"id"或者"poid"或者"oid"(不区分大小写)的话,就认为是实体的主键。

ObjectRelationalMapper类

ObjectRelationalMapper类实现IDomainInspector接口和IObjectRelationalMapper接口。

IObjectRelationalMapper接口实现方法:用于把自定义的Domain语义配置到IExplicitDeclarationsHolder接口的相应集合中。

IDomainInspector接口实现方法:用于验证Domain语义,它从两种角度去验证Domain语义:

  • 其一是在IExplicitDeclarationsHolder接口默认实现(ExplicitDeclarationsHolder类)中相关集合中显式匹配。
  • 其二是在IPatternsHolder接口的默认实现(DefaultNHibernatePatternsHolder类)中相关集合中隐式匹配。

Mapping类

Mapping类是ObjectRelationalMapper和NHibernate映射的桥梁。在ConfOrm.NH命名空间下,Mapping类通过IDomainInspector接口来分析Domain模型语义,我们通过CompileMappingFor()方法或者CompileMappingForEach()方法根据这些语义把程序中的Domain模型编译并转换为NHibernate使用的HbmMapping对象。

ConfORM重要模式

Mapping类除了CompileMappingFor()、CompileMappingForEach()方法之外,还为我们引入了三个重要模式,分别为:模式适配器(pattern-applier)模式、通用定制化(generic-customizer)模式、特定定制化(specific-customizer)模式。

模式适配器(pattern-applier)

模式适配器(pattern-applier),顾名思义,就是Domain模型按模式匹配,如果符合这个模式就进行相应操作。

ConfORM默认提供了很多pattern-applier(即DefaultPatternsAppliersHolder类)。我们可以通过Mapping类的PatternsAppliers属性查看。也可以通过AddXXXPattern()方法增加模式适配器(pattern-applier)。

通用定制化(generic-customizer)

通用定制化(generic-customizer),就是指对通用的类型实现定制化。

我们不需要准确的知道这个类型的真实映射。如果要定制化一个类,我们不需要知道这个类最终被映射为class,subclass,joined-subclass,union-subclass还是component,只是把这个类设置一些属性。同理,你定制化一个集合不需要知道这个集合将映射为bag,set,array,list还是map(dictionary)。

通用定制化由Mapping类的Customize()方法提供。

特定定制化(specific-customizer)

特定定制化(specific-customizer),就是对特定的类或者集合实现定制化。

与通用定制化恰恰相反,我们对特定的类或者特定的某个集合设置一些定制化属性,这个定制化仅对当前你定制的对象有用。

特定定制化由Mapping类的Class()、Subclass()、JoinedSubclass()、UnionSubclass()、Component()方法提供。

结语

这篇文章了解一些ConfORM的原理,以后的文章都是以这篇文章为基础展示ConfORM各种应用。

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-10-25 22:01:01

NHibernate3剖析:Mapping篇之ConfORM实战(2):原理的相关文章

NHibernate3剖析:Mapping篇之ConfORM实战(3):OneToOne语义

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Mapping篇之ConfORM实战(1):概览

ORuM思想浮出 对于ORM(Object Relational Mapping)我们太熟悉了,可是我们从还有一个角度能够想象出ORuM(Object Relational un-Mapping)的思想理念. 我们在程序中只定义Domain, 而想有个工具能够帮助我们"自己主动化"实现Mapping.我们无需按传统的ORM思想那样为Domain手动编码Mapping. ORuM对于使用者来说更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Obj

NHibernate3剖析:Mapping篇之Mapping概览

Mapping概述 NHibernate作为典型的ORM工具,我们使用时通常是先定义Domain,再为Domain映射数据库关系,NHibernate映射是使用XML文件形式的.本篇从整体上了解下NHibernate Mapping处理过程及我们编写方式. Mapping处理过程 当我们Confrontation NHibernate时,NHibernate对Mapping部分到底做了什么事情呢? 解析读取Mapping文件 将Mapping文件反序列化(Deserialize)为XmlDese

NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号. 假设你还不熟悉NHibernate.能够高速阅读NHibernate之旅系列文章导航系列入门,假设你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.c

NHibernate3剖析:Mapping篇之集合映射基础(4):Map映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate剖析:Mapping篇之Mapping-By-Code(1):概览

ModelMapper概述 NHibernate3.2版本集成Mapping-By-Code(代码映射),其设计思想来源于ConfORM,代码整体构思基于"Loquacious"模式,而不是"fluent-interface".在NHibernate.Mapping.ByCode命名空间下. Mapping-By-Code(代码映射)与其他映射方式不同,Mapping-By-Code是手动配置实体映射,编译映射并转换为HbmMapping对象, 调用Configur