1

我一直在将 Fowler 模式用于具有数据映射器的域模型,并且在如何实现 CRUD 的创建部分时遇到了一些困惑。我无法利用现有的 ORM 技术,因为底层数据源是自定义系统。困扰我的领域是当我需要创建一个新对象时如何调用底层 ORM。My Domain Layer 看不到我的 ORM,除了我的查找器。

我不确定我是否走在正确的轨道上,但以下是我能看到的唯一选项:

  1. 以与 Fowler finder 相同的方式处理创建函数。在域模型层中为 ORM 类的创建方法创建一个接口。然后让领域模型调用一个 DI 容器,并根据接口实例化一个 ORM 类的实例。

  2. 在 ORM 中对象 A 的水合期间,附加一个委托,该委托指向对象 B 的 ORM 上的创建方法。要求域对象 A 被水合,您可以调用对象 A 上的委托,这将调用对象 B 的映射器上的 create 方法。

  3. ???

我一定遗漏了一些东西,因为这不可能那么复杂。任何帮助将非常感激。

谢谢

4

4 回答 4

2

看看 ORM 是如何解决这个问题的?在支持动态创建对象的语言中,数据如何与域对象相关的“映射”作为单独的配置提供。这些类是通过反射或字节码库创建的。我想这取决于您希望制作 Data Mapper 的通用程度。从我可以从原始模式中收集到的数据,每个域对象都可以存在数据映射器。

也许您正在尝试通用解决方案。否则,它可能是关于配置一个通用映射器,其中包含有关如何使用反射构建对象的信息。

也就是说,今天的 ORM 层可以处理代表 CanonicalClass 名称的字符串 + 期望在这些类上的方法列表。

传递要持久化的对象可以使用此信息检查对象。可以使用数据库中的数据使用反射来创建对象。一些 ORM 解决方案可能不会以深度方式创建对象树,而是为延迟获取创建代理。

于 2009-06-04T19:02:58.433 回答
1

如果您的问题只是从 Type A 映射到 Type B,您可能需要考虑AutoMapper

于 2009-06-04T19:08:34.613 回答
0

回复:“当我需要创建一个新对象时如何调用底层 ORM”

您是否研究过 AGGREGATE ROOT 和 REPOSITORY 模式的想法 - 它们可能会有所帮助。

作为粗略的总结:AGGREGATE ROOT 是一个“实体”,在系统中具有全局唯一 ID。大多数时候,这些是您的应用程序需要“按 id”获取的唯一对象。它们是通过一个存储库找到的,该存储库通常被初始化以了解应用程序启动/引导时的数据层。

聚合根的工厂通常也被初始化以了解应用程序启动/引导时的数据层。

然后,存储库可以以它喜欢的任何方式调解为对象挖掘数据的过程。REPOSITORY 委托给数据层/映射器以获取原始数据,并倾向于将对象重构的实际工作委托给 FACTORY(类/方法)来进行构建。然后,REPOSITORY 返回新重构的 AGGREGATE ROOT 对象或(collection- of) 到调用 REPOSITORY 的 find 方法的客户端 - 即应用程序。REPOSITORY 是检索和保存 AGGREGATE ROOT 的接口,并给出了它们存储在内存中的行为。

但是,应用程序可能会直接使用 FACTORY 来创建全新的 AGGREGATE ROOT 对象。

AGGREGATE ROOT 的工厂对 ORM/Mapper 层有很好的了解,并且在创建一个全新的实体时,它可能会调用某种“数字序列对象”的服务来获取其唯一 ID。

聚合根通常是您需要“按全局已知 ID 查找”的唯一类型的域对象,因为任何其他域对象都是:

  • 一次性价值对象 - 如货币价值,或
  • “聚合根依赖”实体。即具有仅在 AGGREGATE ROOT 上下文中唯一的 id 的对象,这意味着
    • AGGREGATE ROOT 应该是唯一需要找到/使用它的东西 - 在内部
    • 可以使用 AGGREGATE ROOT 的 ORM Mapper 找到它们
    • 它们的 id 可以由定义其上下文/范围的 AGGREGATE ROOT 创建

延伸阅读:

参见领域驱动设计,Eric Evans。

聚合根: http: //books.google.co.uk/books ?id=7dlaMs0SECsC&lpg=PP1&dq=domain%20driven%20design&pg=PA147#v=onepage&q=&f=false

存储库:http: //books.google.co.uk/books ?id=7dlaMs0SECsC&lpg=PP1&dq=domain%20driven%20design&pg=PA147#v=onepage&q=&f=false

于 2010-01-22T11:31:24.043 回答
0

如果您在 .NET 上实现,正如 Richard 建议的那样,请查看AutoMapper。如果您使用 Java 实现,请查看ModelMapper

于 2011-06-24T05:18:49.170 回答