代码改变世界

NH in Action Defining the mapping metadata

2009-12-23 08:03  jiva  阅读(213)  评论(0编辑  收藏  举报
     ORM tools 要求Application明确在classes and tables, properites and columns, associations and foreign keys, .net types and sql type的映射格式(metadata format),这种信息就是OR Mapping的metadata. 上面说的要去映射的内容应该也就是在写这种Metadata format的时候需要考虑的部分。

      映射存在两种方式: attributes and xml mapping files。

3.3.1 Mapping using XML

     XML格式的Mapping Files有很多有点: 轻量级的、可读的、易编辑的、版本管理的、部署时甚至运行时可以自定义的,但是XML-based metadata 是一种切实可行的方式么?作者列举了社区对使用XML的三种主要反对意见:

     1. 很多已经存在的元数据格式在设计之处时没有考虑到可读性和易编辑性。最主要的一个原因就是属性或者元素值缺少合适的(sensible)的缺省值, 导致无谓的大量的typing。

     2. Metadata-based soulutions 经常被不恰当的使用。Metadata 天生的没有C#代码的灵活性和可维护性。作者这句话的意思应该是XML的确是增强了配置型,但是如果过度的使用,由于XML天生的不具有代码的灵活性和可维护性,所以出了很多问题。但是什么样的的度算是恰当的使用呢?之后使用NH的时候如何掌握这种度?

    3. 没有很好的XML Editor,IDE支持也不好。也没有XSD。

     上面的这些缺点可以归结为如果你这种技术、框架、API、产品如果让使用者在使用上觉得够烦了,也就完了,更何况是在日复一日的工作中。易用性还是很重要的。写框架的人往往不知道做模块的人的痛苦。

      NH设计之初就考虑到这些问题。呵呵,C#也是吸取了很多其他语言的教训,成功往往是需要站在别人的错误上的。针对第一个问题, NH定义了可读性很好并且非常有用的缺省值(这点在前面体会过了,很好),当发现某个值不存在时,NH可以根据映射从类中推断出来。针对第二个问题,感觉没有解决好。针对第三个问题, NH提供了一个文档描述不错的完整的XSD,并且IDE支持也不错了。

作者示例了一个XML Mapping。

clip_image002

上述文档分成这几个部分:

1. 根节点<hibernate-mapping>,所有的映射元素都包含在这个节点内。可以定义多个类映射。

2. NH Mapping XSD 用来进行自动的语法校验和元素自动完成。考虑效率原因,非必填。

3. 类Category映射到相同名字的表Category。

4. <id> mapping element is used to define the details of object identity。

5. 属性Name映射到数据库中具有相同名字的Name列。这里没有类型, NH可以根据映射推断出这个属性的兼容类型。

6. 使用association 和Category建立关联。

     上面几部分正是本节开始部分提到的Metadata 包含的部分。实际上,借助.net强大的反射功能,Mapping中的很多元素、属性可以推断出来,不能确定的可以采用默认值,因此可以省却很多的配置“代码”。写XML配置的时候站在NH的角度想想,就差不多了。

虽然可以在一个Mapping File中映射多个类,但是强烈推荐一个映射文件只包含一个映射类。另外映射文件的推荐命名方式是类名+.hbm.xml

3.3.2 Attribute-oriented programming

另外一种定义方式是采用.net attributes。需要引入NHibernate.Mapping.Attributes 程序集。如下所示:

clip_image004

这句话还是挺有意思的:

Here, Nibernate.Mapping.Attributes generates an XML stream from the mapping in the Category class, and this stream is sent to the NHibernate configuration。

       那么使用xml Mapping 还是.net attributes呢,attributes 更方便、明显的降低了元数据的行数、类型安全的、自动完成的、重构方便。经常在新项目的时候使用。如果说attribute mapping 的配置性不好,那么在部署之前有啥事不能配置编辑的呢?而XML Mapping则是外部文件,可以独立于于领域模型,对于复杂的映射和与映射类无关的信息操纵性很强。适用于类不再我们控制之下的项目。所以推荐使用.net attributes。 当然也会在极少的情况下使用xml的,这时候可以在属性中使用RawXML来插入XML。