19

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

让我们使用以下示例:

如果我有 2 个表 - Customer 和 CustomerParameters。CustomerParameters 表包含用于创建新客户的默认客户值。

然后我必须创建一个CustomersMapper 类来处理所有的Customer 持久性。然后,我的 Customer 和 CustomersList 类将与此映射器类协作以保存客户数据。

我有以下问题:

  1. 如何在不违反某些业务规则的情况下将原始数据传输到我的客户类和从我的客户类到映射器?DTO?

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

  3. Customer 映射器类是否也负责从 CustomerParameters 表中检索默认值,还是创建一个 CustomerParameters 映射器会更好?

AO/R 映射器工具实际上并不在这里。我使用的数据库是事务性的,需要我编写自己的映射器模式。

任何想法和意见将不胜感激。

4

3 回答 3

12

肖恩我会这样回答你的问题:

广告 1) Mapper 负责创建 Customer 对象。您的 Mapper 对象将具有类似 RetrieveById 方法(例如)。它将接受一个 ID 并以某种方式(这不是 Mapper 对象的责任)构造有效的 Customer 对象。反过来也是一样。当您使用有效的 Customer 对象调用 Mapper.Update 方法时,Mapper 对象负责确保所有相关数据都被持久化(在适当的情况下 - 数据库、内存、文件等)

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

广告 3) 我会说是的。但是您可以将 Mapper 对象的各个方面分成单独的类(如果您想要/需要):默认值、规则验证等。

我希望它有所帮助。我真的建议/推荐您阅读 Martin Fowler 的《企业应用程序架构模式》一书。

于 2009-03-09T18:44:54.017 回答
0

您可以查看 iBATIS.NET 作为 NHibernate 的替代品。它也是一个 O/R 工具,但我发现它比 NHibernate 更易于使用。

http://ibatis.apache.org/

于 2009-03-09T20:25:57.380 回答
0

我建议您在尝试自己实现 Data Mapper 模式之前先看一下 O/R-mapper 工具。它将为您节省大量时间。O/R-mapper 的一个流行选择是NHibernate

于 2008-10-16T08:26:19.097 回答