2009-04-17 35 views
1

我一直在使用数据映射器的领域模型的福勒模式,并且遇到了一些关于如何实现CRUD创建部分的混淆。我无法利用现有的ORM技术,因为底层数据源是定制系统。 困扰着我的领域是当我需要创建一个新对象时如何调用下属的ORM。我的域图层没有我的ORM可见性,除了我的发现者。福勒数据映射器对象创建

我不知道如果我在正确的轨道上,但以下是唯一的选择,我可以看到:

  1. 处理好创建函数相同的方式福勒发现者完成。在“域模型”图层中为ORM类上的创建方法创建一个接口。然后让Domain Model调用一个DI容器,并基于该接口实例化ORM类的一个实例。

  2. 在ORM中的对象A的水合过程中,附加一个委托,指向ORM上的对象B的创建方法。要求域对象A是水合的,您可以调用对象A上的委托来调用对象的create方法B的映射器。

  3. ???

我一定会错过一些东西,因为这不能那么复杂。 任何帮助将不胜感激。

谢谢

回答

2

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

也许你正在尝试一个通用的解决方案。否则,它可能是关于配置一个通用映射关于如何使用反射建立对象的信息。

即日ORM层可以处理代表CanonicalClass名称的字符串以及期望这些类的方法列表。

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

1

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

0

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

你有没有看着聚合根和存储库模式的想法 - 他们可能会有所帮助。

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

AGGREGATE的工厂ROOT通常也被初始化为知道关于应用程序启动/引导时的数据层。

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

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

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

骨料根通常是唯一的种域对象的,你需要“由全球知名标识查找”,因为任何其他的域对象要么是:

  • 一次性值对象 - 就像一个货币价值,或
  • 'AGGREGATE ROOT dependent'entities。即有那些只有一个聚合根这意味着
    • 的聚合根应该真的是需要找到它的唯一的事情的范围内唯一的id对象/使用它 - 内部
    • 它们可以通过发现使用聚合根
    • 其ID可以由聚合根定义其上下文/范围中创建的ORM映射器

进一步阅读:

请参阅Domain Driven Design,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