yifeng's profile私人空间PhotosBlogListsMore Tools Help

Blog


    NHibernate使用的问题

    --------------------------------------------------------------------------------------------------------
    最近很多人问到NHibernate的使用问题,为此统一做一个回答:
    1.分层,最好将领域模型与界面应用分开,不要将领域类和界面对象放一起使用,导致混乱。
    2.配置文件,配置文件最好使用config.AddAssembly,AddClass来将领域模型、配置文件、NHibernate联系起来。然后才考虑如:AddXMLFile等的方法。
    3.进行评估或者制作Demo的时候,可以比较灵活处理,如果引入正式的工程中,请为NHibernate建立一个Framework ,和你的其它Framework一起使用包括:Log、事务、消息等等。我将整理一个Framework,请大家下载自己研究。
    4.涉及到大批量数据的时候,可以使用HQL,但最好不要将对象一个一个的导入进来,要考虑将对象的字段(包括ID)导入进来,因为生成一个对象将导致非常多的冗余,性能上也有一些问题。
    5.承接4,最好自己根据MS提供的Data Application Access Block做一个自己的原生SQL执行Framework ,或者对批量数据都使用原生SQL来执行,只是要注意不要和Data系列的Reader、Table、Set联系太紧密,一般来说不要在界面层看到这些东西。


    Framework要考虑如下几个问题:
    1.封装有关Save、Load、Delete方法,所有领域对象都从它继承。
    2.封装有关事务处理的部分
    3.考虑对设计工具的支持
    4.考虑如何自动生成NHibernate需要的配置文件,此时要使用属性
    5.如果从数据库生成类与配置,要考虑使用表模式还是行模式。
     
    有关Framework,部分:
    1.封装Load、Save、Delete这里,要注意,Load一般是封装不来的,为了统一使用,我们还是使用了静态的方法来封装。
    至于Save和Delete建议封装成虚拟方法,当需要在子类中进行关联对象的保存等时,重载它,并且使用事务,如无特殊的情况,就不必要了。
    有关表模式和行模式,大家可以去看Martin的企业应用架构模式或者数据访问模式部分。

    如果用过Gentle的话,可以使用Gentle的自定义属性,来作为域模型的属性,自己写个工具来生成配置文件。我打算更新我的配置文件生成工具,能够支持这个。


    这里为什么我主装封装Load 、Save、Delete等方法,我要说明一下:
    我想我的某个对象如:Person person,
    我想实现:
    person=new Person(“040706”);
    person.Name="caidehui";
    person.Save();

    person =new Person();
    person.ID="040707";
    person.Name="caidehui1"
    person.Save()


    person=new Person("040407")
    person.Delete();

    这样对代码来说还是比较简洁和可读的,如果使用NHibernate的方式的话:
    person =session.Load(typeof(Person),"040707");
    session.Delete(person);
    我总是觉得不够简洁,后来我发现这个方法:
    person=new Person("040407")不能直接使用,因为NHibernate 返回的对象是不能赋值到你的this对象上的,因此我只好使用这种方式
    person=Person.Load("040707");
    person.Delete();
    在Load方法里面实现的就是session.Load(typeof(Person),"040707");

    大家可以根据自己的情况来决定