Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns Fowler数据映射器对象创建_Design Patterns_Orm_Containers_Datamapper_Creation - Fatal编程技术网

Design patterns Fowler数据映射器对象创建

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水

我一直在使用Fowler模式作为带有数据映射器的域模型,在如何实现CRUD的创建部分上遇到了一些困惑。我不能利用现有的ORM技术,因为底层数据源是定制系统。 困扰我的地方是当我需要创建一个新对象时如何调用下划线ORM。我的域层没有我的ORM的可见性,除了我的查找器

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

  • 以与Fowler查找器相同的方式处理create函数。在域模型层中为ORM类上的创建方法创建接口。然后让域模型调用DI容器,并基于接口实例化ORM类的实例

  • 在ORM中对象A水合过程中,附加一个委托,该委托指向ORM中对象B的创建方法。需要域对象A水合时,您可以调用对象A上的委托,该委托将调用对象B映射器上的创建方法

  • 我一定错过了什么,因为事情不会那么复杂。 任何帮助都将不胜感激


    谢谢

    看看ORMs是如何解决这个问题的?在支持动态创建对象的语言中,数据如何与域对象相关的“映射”作为单独的配置提供。这些类是通过反射或字节码库创建的。我想这取决于你想让数据映射器变得多么通用。根据我从原始模式收集的数据,映射器可以存在于每个域对象中

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

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


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

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

    您是否研究过聚合根和存储库模式的概念?它们可能会有所帮助

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

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

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

    但是,应用程序可以直接使用工厂来创建全新的聚合根对象

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

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

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

    请参阅领域驱动设计,Eric Evans

    聚合根:

    寄存人:

    如果您是在.NET上实现的,请按照Richard的建议进行检查。如果您是用Java实现的,请查看