Ruby on rails 典型的.NETDDD体系结构与Django/Rails实践

Ruby on rails 典型的.NETDDD体系结构与Django/Rails实践,ruby-on-rails,asp.net-mvc,django,architecture,domain-driven-design,Ruby On Rails,Asp.net Mvc,Django,Architecture,Domain Driven Design,我已经习惯了所有典型的领域驱动设计实践,这些实践在大多数与现代.net编程相关的出版物和博客中都很流行。因此,当我与一些Django人交谈时,他们并不关心持续的无知、视图模型等,这让我感到惊讶 当您在Django或Rails中使用活动记录时,缺少持久性的无知部分似乎是可以理解的,但在ASP.NETMVC环境中工作了一段时间后,在视图中使用域实体看起来绝对是邪恶的(我想Java MVC框架也是如此) 这不是一个单一的案例,它涉及到绝大多数Django/Rails项目(通常被认为是敏捷的) 为什么呢

我已经习惯了所有典型的领域驱动设计实践,这些实践在大多数与现代.net编程相关的出版物和博客中都很流行。因此,当我与一些Django人交谈时,他们并不关心持续的无知、视图模型等,这让我感到惊讶

当您在Django或Rails中使用活动记录时,缺少持久性的无知部分似乎是可以理解的,但在ASP.NETMVC环境中工作了一段时间后,在视图中使用域实体看起来绝对是邪恶的(我想Java MVC框架也是如此)

这不是一个单一的案例,它涉及到绝大多数Django/Rails项目(通常被认为是敏捷的)

为什么呢?这仅仅是因为动态语言特性使得像DI这样的实践变得不必要吗?或者,在一个企业化的.NET/Java世界里,可能有太多的过度工程


你知道还有什么不同吗?对于.net/java world来说,有什么可以吸取的教训吗?或者相反,只是rubist和pythonistas通常没有与足够大的项目合作来理解这些模式的优势吗?

也许这是您解释viewmodel优势的机会,我个人认为这完全是浪费时间和空间。虽然我的大部分MVC工作都是在Rails中进行的,但我目前正在Spring中工作,到目前为止,我一直与存储在关系数据库中的模型直接交互

如果要使模型的某些属性不可访问,则不要公开它们。如果愿意,您可以在before_save方法或其他地方为它们提供进一步的保护,但考虑到用户可能知道您选择不公开的属性的名称,这是必要的吗


如果有其他一些原因说明viewmodel是有益的,那么我会全神贯注地听(或看,视情况而定)。

很好,已经有很多讨论了。以下是我对此事的看法:

通常,直接为表单访问域模型要容易得多。这是Rails中的编码(我不知道Django,但我猜也是一样)极大地提高了生产力的一个因素。几乎没有任何编码需要:有一个数据库表,在中间建立一些HTML和一个简单的控制器,然后你就完成了。因为几乎不涉及任何代码,所以您可以更快地进行更改,这就是为什么它在敏捷环境中工作得很好

但是,总有一段时间这还不够。有时,您的应用程序太复杂,无法正常工作。此时,您可以添加视图模型、演示者、立面或任何您想称之为它们的东西。在Rails或Django中,没有什么可以阻止您这样做。事实上,Rails 3引入了ActiveModel作为一组混音,使每个对象在处理ActiveRecord时都能像处理表单一样轻松地工作

所以问题不是Rails和Django为什么不这么做,而是我应该什么时候使用它?称DDD为过度工程也不是真的。这是关于做“足够”来解决你的问题。将代码量和复杂性保持在尽可能低的水平,这样您将更易于维护

我同意,从Java/.NET中肯定可以学到一些教训。通常他们已经很好地解决了设计模式的问题。但说红皮主义者和蟒蛇主义者没有完成足够大的项目是不正确的。这种力量来自于认识到什么时候你可以用一个简单的解决方案逃脱惩罚


我确实认为Java程序员(我没有.NET程序员的经验)倾向于过度工程化。也许是他们使用的框架。它似乎试图迫使程序员以“正确的方式”完成它,从而使它变得过于复杂。

ViewModels是关于UI的,models是关于域的。它们不一定是相同的(即使你可以将一个转换成另一个)。@rsenna:但是拥有一个ViewModel有什么意义呢?视图与ViewModel交互是否比与模型交互更容易?如果是这样,这似乎是视图技术中的一个设计缺陷。或者可能有一些安全方面的好处?但我确实没有看到任何瑕疵。@Samo:我不认为有任何瑕疵;它们只是语义不同而已。例如,想象地图上的点——对于视图,它们可能应该使用像素坐标表示,但必须在模型中存储为纬度/经度对。。。当然,这并不意味着您必须用Python或Ruby等动态语言保留正式的ViewModels定义(例如,只使用字典可能更容易),但这确实意味着您不应该简单地向视图公开域模型。@rsenna:视图可能负责将纬度/经度转换为像素,控制器或模型本身可能负责转换回纬度/经度。这种转换必须发生在某个地方,我不认为有必要使用不同对象的开销来进行这种转换。我们仍然可以向用户公开相同的模型,而不公开对他们不有用的属性,即纬度和经度。@Samo-另一个典型的例子是带有密码和密码确认输入的注册表。你会仅仅为了这个表单而将password2字段添加到你的用户模型中吗?