NHibernate学习手记(4) - 持久化类(Persistent class)的设计

NH中把需要持久化服务(保存到数据库)的类称为Persistent class,目的和常见的Serializable(可序列化)一样,都是把程序运行时创建的临时对象(transient objects)保存到数据库、文件等介质中。


NH的Online Document推荐的持久化类设计模式称为POCO(Plain Old CLR Object Model)和我们的BusinessEnitity层的设计基本一致。

下面是一个简单订单(Order)的类定义

using System;

namespace NHConsole
{
///
/// Order 的摘要说明
///
/// 创 建 人: Aero
/// 创建日期: 2006-3-16
/// 修 改 人:
/// 修改日期:
/// 修改内容:
/// 版 本:
public class Order
{
private Guid _orderId;
private DateTime _placeTime = System.DateTime.Now;
private Customer _customer = null;
private string _shipToPlace = string.Empty;
private System.Collections.IList _items = null;

public Guid OrderID
{
get { return this._orderId; }
set { this._orderId = value; }
}

public Customer Customer
{
get { return this._customer; }
set { this._customer = value; }
}

public DateTime PlaceTime
{
get { return this._placeTime; }
set { this._placeTime = value; }
}

public string ShipToPlace
{
get { return this._shipToPlace; }
set { this._shipToPlace = value; }
}

public System.Collections.IList Items
{
get { return this._items; }
set { this._items = value; }
}


#region 构造函数
///
/// 默认无参构造函数
///
/// 创 建 人: Aero
/// 创建日期: 2006-3-16
/// 修 改 人:
/// 修改日期:
/// 修改内容:
public Order()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

#endregion
}
}
可总结出POCO风格的几种特点

1、不考虑实体类的操作(通常会有相应的业务层去处理,一般称为EntityManager或EntityService),只定义了实体的数据成员和对应的getter/setter。

2、带无参构造函数(default constructor)。

NH通过反射和动态代理的机制来实现O/R映射,所以上述的getter/setter和constructor可定义为public/protected/private,甚至是internal。

Martin Fowler称这样的设计模型为贫血模型(http://forum.javaeye.com/viewtopic.php?t=11712),我也认为把对象的操作和对象的数据剥离是一种非常丑陋的设计,随着NH学习的深入,以后的文章也想讨论一些关于领域模型和设计模式的话题。

posted on 2006-03-17 09:12 Aero 阅读(2473) 评论(8)  编辑 收藏 网摘 所属分类: 敏捷数据

评论

#1楼  2006-03-17 12:39 Terrylee      

怎么说呢,我觉得这种设计有一个好处是我们仍然可以按照以前的方式去开发N层结构,如果把对象的操作和数据成员放在一起,在开发上可能就简化了,但是好像会破坏这种结构,给人一种实体类和数据访问混在一起的感觉!

一会儿我贴出我常见到的两种方式,大家可以讨论一下:-)   回复  引用  查看    

#2楼  2006-03-17 15:13 麒麟.NET      

如果所有的业务逻辑都封装在实体类里,那么是否还有必要有业务逻辑层呢?   回复  引用  查看    

#3楼 [楼主] 2006-03-18 18:11 Aero      

@ Terrylee and 麒麟.NET

我更倾向于在简单对象中封装相关的数据操作,遍布代码的session.Save非常的不优雅。而且同样还可以使用三层模型,在BL中编写复杂的逻辑操作(可能会关联到多个对象)。   回复  引用  查看    

#4楼  2006-03-23 20:21 liu.yuanhuo      

Terrylee 没把链接粘过来,我顺手,好找资料
http://terrylee.cnblogs.com/archive/2006/03/17/352172.html   回复  引用  查看    

#5楼  2006-04-06 16:51 ff [未注册用户]

http://www.pltjd.com   回复  引用    

#6楼  2006-04-06 16:51 ff [未注册用户]

hhhhhhhhhhhhhhhhhhhhhh   回复  引用    

#7楼  2006-05-30 22:28 思无邪      

如果业务比较简单,持久化类(Persistent class),可以加上些业务逻辑
只映射数据表的字段是不够的,可以加上简单的逻辑,不涉及到crud操作   回复  引用  查看    

#8楼  2006-05-31 16:37 一汐      

同意楼上的说法,个人认为如果业务逻辑相对简单的话,可以把对象操作放到持久化类中……
关注中……   回复  引用  查看    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-03-17 09:15 编辑过
Google站内搜索
找找看

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 

导航

公告

从不了解到了解,从了解到熟悉,从熟悉到精通,这纪录了一个人思考和解决问题的成长过程。

转载请遵守 创作共用约定

关于语音参数分析平台: 毕设也博客

msn: wk_kevin at hotmail.com
email: chwkai at gmail.com
Free Website Counter
<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

与我联系

搜索

 

常用链接

留言簿(17)

我参加的小组

我参与的团队

随笔分类(66)

随笔档案(59)

文章分类(18)

相册

about Aero

friendz

project bloggerz

project sitez

techz

积分与排名

最新评论

  • 1. re: 毕设也博客
  • 自己是在做语音这块,一个人挑大梁很类,你写的东西确实给我一定启发。我觉得也挺有用的。我不是做毕业设计,是做这方面的研究,但是还有好些问题确实不懂。书也看的少了些,但是这方面的书也不非常多,论文么都是差...
  • --keiko_49

阅读排行榜

评论排行榜