福勒数据映射器对象创建

时间:2009-04-17 21:23:21

标签: design-patterns orm containers datamapper creation

我一直在使用带有数据映射器的域模型的Fowler模式,并且在如何实现CRUD的创建部分方面遇到了一些困惑。我无法利用现有的ORM技术,因为底层数据源是自定义系统。 困扰我的是如何在我需要创建新对象时调用底层ORM。我的域名层没有我的ORM的可见性,但我的查找器除外。

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

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

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

  3. ???

  4. 我必须遗漏一些东西,因为这不会那么复杂。 任何帮助将不胜感激。

    由于

4 个答案:

答案 0 :(得分:2)

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

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

到目前为止,ORM层可以处理表示CanonicalClass名称的字符串+在这些类上预期的方法列表。

传递要保留的对象可以使用此信息检查对象。可以使用来自数据库的数据使用反射来创建对象。某些ORM解决方案可能无法深入创建对象树,而是创建延迟提取的代理。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

粗略总结: AGGREGATE ROOT是一个“实体”,在系统中具有全局唯一ID。大多数情况下,这些是您的应用程序需要“通过id”抓取的唯一对象。它们是通过REPOSITORY找到的,通常在应用程序启动/引导时初始化为知道有关数据层的信息。

AGGREGATE ROOT的工件通常也会在应用程序启动/启动时初始化为知道有关数据层的信息。

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

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

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

AGGREGATE ROOT通常是“按全球已知ID查找”所需的唯一域对象,因为任何其他域对象都是:

  • 一次性价值对象 - 比如金钱价值,或者
  • 'AGGREGATE ROOT dependent'实体。即具有ID的对象在AGGREGATE ROOT的上下文中仅是唯一的,这意味着
    • 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

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

答案 3 :(得分:0)

如果你在.NET上实现,理查德建议查看AutoMapper。如果您使用Java实现,请查看ModelMapper