数据映射器模式

19

到目前为止,在我所有的c#数据库驱动应用程序中,我一直在使用Active Records。但现在,我的应用需要将持久性代码从业务对象分离出来。我已经阅读了很多关于Martin Fowler的数据映射模式的帖子,但我对这个模式的了解仍然非常有限。

让我们举一个例子:

如果我有两个表 - Customer和CustomerParameters。CustomerParameters表包含创建新客户所需的默认客户值。

那么我就必须创建一个CustomersMapper类来处理所有的Customer持久性。我的Customer和CustomersList类将与此mapper类合作以持久化客户数据。

我有以下几个问题:

  1. 如何在不破坏某些业务规则的情况下将原始数据传输到我的Customer类,并从mapper中传回数据?使用DTO?

  2. 在我的Mapper类中是否可以有SaveAll和LoadAll方法来更新和加载多个客户的数据?如果可以,在SaveAll的情况下,如何知道何时更新或插入数据?

  3. Customer mapper类是否也负责从CustomerParameters表中检索默认值,还是最好创建一个CustomerParameters mapper?

没有O/R映射工具。我使用的数据库是事务性的,需要我自己编写Mapper Pattern。

非常感谢您的想法和评论。


2
你能详细解释一下“Transactional”的含义吗?特别是与传统的事务性关系型数据库(如MS-SQL或MySQL)进行对比。否则,我会毫不犹豫地支持Petter的答案。 - David Schmitt
1
我正在使用基于索引顺序访问方法(ISAM)的Btrieve,它不是基于SQL的。我熟悉的所有O/R映射工具都不支持Btrieve。 - MegaByte
3个回答

12

Shaun,我的回答如下:

1)Mapper负责创建Customer对象。您的Mapper对象将拥有类似RetrieveById的方法(例如)。它将接受一个ID并且以某种方式(这是Mapper对象的责任)构造出有效的Customer对象。相反地,当您使用有效的Customer对象调用Mapper.Update方法时,Mapper对象负责确保所有相关数据(在适当的地方 - db,memory,file等)都被持久化。

2)正如我上面所说,retrieve/persist是Mapper对象的方法。提供这样的功能是它的责任。因此,LoadAll,SaveAll(可能传递值对象数组)都是有效的Mapper方法。

3)我会说可以。但是,如果需要的话,您可以将Mapper对象的各个方面分成不同的类:默认值、规则验证等。

希望有所帮助。我真诚建议/推荐您阅读Martin Fowler的书Patterns of Enterprise Application Architecture


0

在您尝试自己实现数据映射器模式之前,我建议您先查看一些O/R-mapper工具。这将节省您大量时间。一种常用的O/R-mapper选择是 NHibernate


一个O/R映射工具对我来说并不是一个选择。我使用的数据库是事务性的,需要我编写自己的Mapper模式。 - MegaByte

0
你可以尝试使用iBATIS.NET作为NHibernate的替代品。它也是一个O/R工具,但我发现它比NHibernate更容易使用一些。

http://ibatis.apache.org/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接