Spiga

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

2011-04-10 15:24 by 李永京, 3844 visits, 收藏, 编辑

本节内容

ModelMapper概述

NHibernate3.2版本集成Mapping-By-Code(代码映射),其设计思想来源于ConfORM,代码整体构思基于"Loquacious"模式,而不是"fluent-interface"。在NHibernate.Mapping.ByCode命名空间下。

Mapping-By-Code(代码映射)与其他映射方式不同,Mapping-By-Code是手动配置实体映射,编译映射并转换为HbmMapping对象, 调用Configuration类的void AddDeserializedMapping(HbmMapping mappingDocument, string documentFileName)方法配置Configuration,其他映射(例如Fluent NHibernate、MyGeneration、Visual NHibernate等)实际上是调用AddXmlReader()方法后,反序列化为HbmMapping对象,然后再调用AddDeserializedMapping方法配置Configuration。 最后BuildSessionFactory。Mapping-Path示意图如下:

nh3-mapping-path

ModelMapper架构

ModelMapper核心是配置领域模型映射,编译并转换为HbmMapping对象。按照其功能ModelMapper类有四个部分,分别是:

  • 特定映射(Specific Mapper)
  • Conformist映射(Conformist Mapping)
  • 事件拦截器(Events Interceptor)
  • 编译映射(CompileMapping)

特定映射(Specific Mapper)

特定映射(Specific Mapper),对特定的类或者特定的某个组件设置定制化映射。由Class、Subclass、JoinedSubclass、UnionSubclass、Component方法提供。

ModelMapper-SpecificMapper

Conformist映射(Conformist Mapping)

Conformist映射(Conformist Mapping)是以Class-By-Class方式映射,然后加入ModelMapper类。

ModelMapper-AddMapping

事件拦截器(Events Interceptor)

在每种映射行为前后,都定义了事件拦截器,可以通过事件拦截器定义约束。从设计角度上看是对ModelMapper类提供了扩展性。

ModelMapper-Events

编译映射(CompileMapping)

把程序中的领域实体的映射编译并转换为NHibernate使用的HbmMapping对象。CompileMappingFor、CompileMappingForEach方法指定特定领域实体,CompileMappingForAllExplicitAddedEntities和CompileMappingForEachExplicitAddedEntity方法已经显式指定提供映射的实体。

ModelMapper-CompileMapping

结语

这篇文章首先了解NHibernate3.2新增的Mapping-By-Code(代码映射)的原理,后续的文章以这篇文章为基础学习Mapping-By-Code各种映射。

参考资料

Fabio Maulo:NHibernate 3.2 mapping by code

Fabio Maulo:NHibernate 3.2: (part 2) mapping by code

标签: NHibernate
Add your comment

12 条回复

  1. #1楼 MSYXing      2011-04-10 15:27
    哈哈,第一次占到沙发
     回复 引用 查看   
  2. #2楼 doit      2011-04-10 15:29
    今天终于抢到李老大的沙发了,永京辛苦啦.
    拜读
     回复 引用 查看   
  3. #3楼 James.H.Fu      2011-04-10 15:30
    NH到底适合什么开发项目?有人说性能,灵性性不好。看来有时间我要好好用一下,亲身感觉一下才行。
     回复 引用 查看   
  4. #4楼 乐鱼      2011-04-10 15:31
    顶顶
     回复 引用 查看   
  5. #5楼[楼主] 李永京      2011-04-10 15:37
    @doit
    可惜,差了一步了
     回复 引用 查看   
  6. #6楼[楼主] 李永京      2011-04-10 15:42
    @James.H.Fu
    这个只有自己用的才能体会,你也不知道别人怎么用的,按照死板的CRUD?就概全的评论一个框架了,这样的评论可信么,至少没有去优化程序。ORM的思想是对象,对象是有生命周期的,要在正确的生命周期下做正确的事情才能把性能调好并灵活扩展。NHibernate是一个框架并不是别人说的做仅仅CRUD的东西...
     回复 引用 查看   
  7. #7楼[楼主] 李永京      2011-04-10 15:43
    @MSYXing
    恭喜了,我也很久没有发文了....
     回复 引用 查看   
  8. #8楼 路过秋天      2011-04-10 17:04
    啥时候有空闲也研究下:cyq.data,相当期待啊。
     回复 引用 查看   
  9. #9楼 燕之威      2011-04-11 09:29
    顶一个,楼主勇往之前的精神真是让我钦佩呀。
     回复 引用 查看   
  10. #10楼 James.H.Fu      2011-04-13 23:29
    @李永京
    谢谢。
     回复 引用 查看   
  11. #11楼 开国伟人      2011-09-30 13:50
    到底用神马呢。
     回复 引用 查看   
  12. #12楼 易元      2012-01-16 10:47
    @开国伟人
    神牛
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2011454 erzyFpxl5xY=