Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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
Ruby on rails Activerecord的Rails域模型解耦_Ruby On Rails_Activerecord_Domain Driven Design_Anti Patterns_Domain Model - Fatal编程技术网

Ruby on rails Activerecord的Rails域模型解耦

Ruby on rails Activerecord的Rails域模型解耦,ruby-on-rails,activerecord,domain-driven-design,anti-patterns,domain-model,Ruby On Rails,Activerecord,Domain Driven Design,Anti Patterns,Domain Model,我一直在读《SQL反模式:避免数据库编程的陷阱》一书,尤其是关于魔豆反模式的书。在图中,它显示了一个通过使用域模型来解耦activerecords的图,其中有PHP中的示例,但没有Rails,它将此称为has—域模型和视图/控制器之间的聚合,以及has—域模型和activerecords之间的组合(我假定这是UML语言) 在Rails中,通过使用模型方法使瘦控制器成为胖模型似乎是常见的,这些方法可能会操纵其他关联的模型,以便在任何给定的控制器中只能使用一个模型。然而,我想知道是否有一种实践包括R

我一直在读《SQL反模式:避免数据库编程的陷阱》一书,尤其是关于魔豆反模式的书。在图中,它显示了一个通过使用域模型来解耦activerecords的图,其中有PHP中的示例,但没有Rails,它将此称为has—域模型和视图/控制器之间的聚合,以及has—域模型和activerecords之间的组合(我假定这是UML语言)

在Rails中,通过使用模型方法使瘦控制器成为胖模型似乎是常见的,这些方法可能会操纵其他关联的模型,以便在任何给定的控制器中只能使用一个模型。然而,我想知道是否有一种实践包括Rails中的完全解耦


也就是说,创建一个无表模型或其他类,用作域模型,充当控制器和activerecord对象(反过来映射到表)之间的层,以便控制器具有更好的隔离性,并且不需要了解任何有关底层数据库及其结构的信息。它还提供了一个选项,可以避免使用CRUD方法,因为CRUD方法不能解释它们所应用的应用程序需求,这是本书中的另一个批评。

我的评论来自于将DDD与ASP.NET MVC结合使用。推荐的将控制器绑定到域实体的方法是通过视图模型,该模型专门用于绑定到特定视图。视图模型在绑定机制和域模型之间提供了急需的缓冲区。通常情况下,给定视图可能是多个域实体甚至报告对象的组合,因此不直接与任何给定域实体对应。在视图模型中声明视图所需的属性可以明确这些数据需求,而不会导致人们试图调整域模型以满足视图的需要

当然,缺点是可能出现双类层次结构,其中您可能有一个与许多域实体对应的视图模型。然而,在实践中,我发现维护双类层次结构比担心更改域实体的后果要容易得多。看一看

在SOA系统中,查看模型“包装”的对象可能不是域实体,而是表示这些域实体的DTO。这并不违反视图模型的结构,因为它们本身就是DTO,没有行为方面,只有数据。请看一篇讨论应用程序边界数据性质的文章


为了回答您的问题,我相信创建一个视图模型层对于Rails应用程序来说是有利的,因为上面已经给出了所有的警告。视图模型将填充来自活动记录对象或包含要显示的数据的任何其他对象的数据,然后当用户输入数据时,视图模型将更新活动记录对象或域模型实体。尽管我不想将这个视图模型层称为域模型。

您可能会发现这个基于Rails的应用程序很有用:-它旨在展示如何以Robert C.Martin推荐的方式与ActiveRecord解耦。它被称为用例驱动架构或实体控制边界模式。

感谢这为我指明了这个stackoverflow线程的方向,然后是Jay Fields,他在RailsConfEU 07上介绍了一些演示者模式方面的工作。。。我认为这是一个在演讲者模式或移动相关创作和其他逻辑模型之间的折腾,Jamis Bucks在瘦控制器胖模型上旋转,这似乎是rails世界的标准。实际上我更喜欢presenter模式,我认为它可以生成更干净的代码。我还发现有一本书“Advanced Rails Recipes”,其中包含演示者模式的Jay Fields实现,我将看看是否可以从库中找到并借用副本。我希望有人在这项工作的基础上扩展Rails生成器。