yifeng's profile私人空间PhotosBlogListsMore ![]() | Help |
|
|
July 02 NHibernate 使用手迹(2nd)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"); 大家可以根据自己的情况来决定 |
|
|