【问题标题】:Data Mapper Pattern数据映射器模式
【发布时间】:2010-09-17 11:46:14
【问题描述】:

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

让我们使用以下示例:

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

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

我有以下问题:

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

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

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

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

任何想法和cmets将不胜感激。

【问题讨论】:

  • 您能否扩展您对“事务性”的含义,尤其是与传统的事务性 RDBMS(如 MS-SQL 或 MySQL)进行对比?否则我会毫不含糊地支持 Petter 的回答。
  • 我正在使用不基于 SQL 的 Btrieve(基于索引顺序访问方法 (ISAM))。我熟悉的所有 O/R Mapping 工具都不支持 Btrieve。

标签: datamapper


【解决方案1】:

Shaun 我会这样回答你的问题:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • O/R 映射器工具对我来说并不是一个真正的选择。我使用的数据库是事务性的,需要我编写自己的映射器模式。
    【解决方案3】:

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

    http://ibatis.apache.org/

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      相关资源
      最近更新 更多