我一直在使用带有数据映射器的域模型的Fowler模式,并且在如何实现CRUD的创建部分方面遇到了一些困惑。我无法利用现有的ORM技术,因为底层数据源是自定义系统。 困扰我的是如何在我需要创建新对象时调用底层ORM。我的域名层没有我的ORM的可见性,但我的查找器除外。
我不确定自己是否走在正确的轨道上,但以下是我能看到的唯一选择:
处理创建函数的方式与Fowler查找器的完成方式相同。在“域模型”层中为ORM类的创建方法创建接口。然后让Domain Model调用一个DI容器,并根据接口实例化一个ORM类的实例。
在ORM中对象A的水合期间,附加指向对象B的ORM上的创建方法的委托。要求域对象A是水合的,您可以调用对象A上的委托,该对象将调用创建方法对象B的映射器。
???
我必须遗漏一些东西,因为这不会那么复杂。 任何帮助将不胜感激。
由于
答案 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查找”所需的唯一域对象,因为任何其他域对象都是:
进一步阅读:
参见领域驱动设计,Eric Evans。
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。