福勒数据映射器对象创建
我一直在使用数据映射器的域模型的Fowler模式,并且在如何实现CRUD的创建部分时遇到了一些困惑。 我无法利用现有的ORM技术,因为底层数据源是定制系统。 困扰我的领域是当我需要创建一个新对象时如何调用ORM。 我的域图层没有我的ORM可见性,除了我的发现者。
我不确定我是否在正确的轨道上,但以下是我可以看到的唯一选项:
处理创建函数的方式与Fowler查找器完成的方式相同。 在“域模型”图层中为ORM类上的创建方法创建一个接口。 然后让Domain Model调用一个DI容器,并基于该接口实例化ORM类的一个实例。
在ORM中的对象A的水合过程中,将一个委托指向ORM上的对象B的创建方法。要求域对象A是水合的,您可以调用对象A上的委托来调用对象B的映射器上的create方法。
???
我必须错过一些东西,因为这不可能如此复杂。 任何帮助将非常感激。
谢谢
如何看待ORM如何解决这个问题? 在支持动态创建对象的语言中,“映射”数据与域对象的关系如何作为单独的配置提供。 这些类是通过反射或字节码库创建的。 我想这取决于你想要制作Data Mapper的普遍程度。 从我可以从原始模式中收集的数据映射器可以存在于每个域对象中。
也许你正在尝试一个通用的解决方案。 否则,它可能是关于配置一个通用映射关于如何使用反射建立对象的信息。
那就是ORM层可以处理代表CanonicalClass名称的字符串,以及期望这些类的方法列表。
传递一个持久化对象可以使用这些信息来检查对象。 使用来自数据库的数据可以使用反射来创建对象。 一些ORM解决方案可能不会以深入的方式创建对象树,而是为延迟获取创建代理。
如果你的问题只是从类型A映射到类型B,你可能需要考虑AutoMapper。
回复:“当我需要创建一个新对象时,如何调用底层ORM”
你有没有看过AGGREGATE ROOT和REPOSITORY模式的想法 - 它们可能会有所帮助。
作为一个粗略的总结: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通常是唯一需要通过全局已知标识查找的域对象,因为任何其他域对象都是:
进一步阅读:
请参阅域驱动设计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
链接地址: http://www.djcxy.com/p/96043.html上一篇: Fowler Data Mapper Object Creation
下一篇: How do I control AVAssetWriter to write at the correct FPS