Design patterns Fowler数据映射器对象创建
我一直在使用Fowler模式作为带有数据映射器的域模型,在如何实现CRUD的创建部分上遇到了一些困惑。我不能利用现有的ORM技术,因为底层数据源是定制系统。 困扰我的地方是当我需要创建一个新对象时如何调用下划线ORM。我的域层没有我的ORM的可见性,除了我的查找器 我不确定我是否在正确的轨道上,但以下是我能看到的唯一选择:Design patterns Fowler数据映射器对象创建,design-patterns,orm,containers,datamapper,creation,Design Patterns,Orm,Containers,Datamapper,Creation,我一直在使用Fowler模式作为带有数据映射器的域模型,在如何实现CRUD的创建部分上遇到了一些困惑。我不能利用现有的ORM技术,因为底层数据源是定制系统。 困扰我的地方是当我需要创建一个新对象时如何调用下划线ORM。我的域层没有我的ORM的可见性,除了我的查找器 我不确定我是否在正确的轨道上,但以下是我能看到的唯一选择: 以与Fowler查找器相同的方式处理create函数。在域模型层中为ORM类上的创建方法创建接口。然后让域模型调用DI容器,并基于接口实例化ORM类的实例 在ORM中对象A水
谢谢看看ORMs是如何解决这个问题的?在支持动态创建对象的语言中,数据如何与域对象相关的“映射”作为单独的配置提供。这些类是通过反射或字节码库创建的。我想这取决于你想让数据映射器变得多么通用。根据我从原始模式收集的数据,映射器可以存在于每个域对象中 也许您正在尝试一个通用的解决方案。否则,它可能是关于使用有关如何使用反射构建对象的信息配置通用映射器 也就是说,到目前为止,ORM层可以处理表示CanonicalClass名称+这些类上预期的方法列表的字符串
通过传递要持久化的对象,可以使用此信息检查对象。可以使用数据库中的数据使用反射来创建对象。一些ORM解决方案可能不会深入地创建对象树,而是为延迟获取创建代理如果您的问题只是从A类型映射到B类型,您可能需要考虑。
RE:“当我需要创建一个新对象时,如何调用底层ORM”
您是否研究过聚合根和存储库模式的概念?它们可能会有所帮助 作为一个粗略的总结: 聚合根是在系统中具有全局唯一id的“实体”。大多数情况下,这些是应用程序需要“按id”获取的唯一对象。它们是通过存储库找到的,存储库通常在应用程序启动/引导时初始化以了解数据层 聚合根的工厂通常也会初始化,以便在应用程序启动/引导时了解数据层 然后,存储库可以以它喜欢的任何方式调解挖掘对象数据的过程。存储库委托数据层/映射器获取原始数据,并倾向于将对象重构的实际工作委托给工厂(类/方法)进行构建。存储库然后返回新重构的聚合根对象或(对象的集合)调用存储库的find方法的客户端,即应用程序。存储库是检索和保存聚合根的接口,并给出它们存储在内存中的行为 但是,应用程序可以直接使用工厂来创建全新的聚合根对象 聚合根的工厂对ORM/Mapper层有很好的了解,在创建一个全新的实体时,它可能会调用某种“数字序列对象”的服务来获取其唯一id 聚合根通常是唯一需要“通过全局已知Id查找”的域对象,因为任何其他域对象都是:- 一次性价值对象-如货币价值,或
- “聚合根依赖”实体。即,对象的ID仅在聚合根的上下文中是唯一的,这意味着
- 聚合根实际上应该是唯一需要在内部找到/使用它的东西
- 可以使用聚合根的ORM映射器找到它们
- 它们的ID可以由定义其上下文/范围的聚合根创建
如果您是在.NET上实现的,请按照Richard的建议进行检查。如果您是用Java实现的,请查看