Java DDD对于web应用程序,我应该将一个富域对象放入表示层吗?

Java DDD对于web应用程序,我应该将一个富域对象放入表示层吗?,java,session,domain-driven-design,session-variables,Java,Session,Domain Driven Design,Session Variables,我正在尝试用DDD开发一个web应用程序。但在最佳实践中,我不确定是否应该将富域对象直接放入web会话中?例如:正如建议的那样,它将EntityManager放在域对象上,我认为如果我想将域对象放在web会话中是不好的 那么,您能否分享一些将DDD应用于web应用程序的实际经验?特别是如何使用web会话处理富域对象?还有什么好的演示应用程序(Java)我可以参考吗 谢谢, 利昂 亲爱的MikeSW,MaxS,谢谢你宝贵的回答 因此,在实践中,如果我使用DDD,我仍然必须装箱一个浅层(贫血)对象

我正在尝试用DDD开发一个web应用程序。但在最佳实践中,我不确定是否应该将富域对象直接放入web会话中?例如:正如建议的那样,它将EntityManager放在域对象上,我认为如果我想将域对象放在web会话中是不好的

那么,您能否分享一些将DDD应用于web应用程序的实际经验?特别是如何使用web会话处理富域对象?还有什么好的演示应用程序(Java)我可以参考吗

谢谢, 利昂


亲爱的MikeSW,MaxS,谢谢你宝贵的回答

因此,在实践中,如果我使用DDD,我仍然必须装箱一个浅层(贫血)对象模型,或DTO,以便在表示层和服务(业务)层之间共享数据

我的理解正确吗

如果有任何好的参考应用程序或文章谈论类似的架构,请让我知道。 我试图找到一些,但希望看到更多


谢谢,由于技术(资源浪费)和语义上的原因,Leon(或任何复杂对象)域对象不应该被置于会话中。会话不是缓存,而是tmeporary用户数据的持有者。将对象id存储在会话中,然后使用存储库检索实际对象。如果需要,存储库可以缓存内容。

域对象与表示模型无关
使用域驱动设计,您不必担心数据的显示方式,也不必担心数据的持久化方式。你唯一需要关注的事情就是为你的业务建模

此外,向前端用户公开您的业务模型并不是最佳做法。他们不必知道您的业务是如何运行的,您的业务规则是什么或与业务相关的任何内容。
这就是ViewModel或DTO的用途。这些是表示层实体,构建用于通过任何类型的web服务显示或公开

出于其他原因,让您的DB模型看起来像您的业务模型并不是一个好的选择。DB引擎必须处理其他问题,这些问题将导致您以不同于您设计域的方式组织数据的存储方式

关于会话,请尽可能使其轻松。正如@MikeSW所说:

会话不是缓存

假设您希望存储会话中的每个实体。它可能很容易达到250kb左右。乍一看,它可能看起来不大,但如果您的服务器被10000个不同的用户攻击呢?您的会话大小将戏剧性地增长到2,3Gb!仅适用于会话数据!这显然会导致性能问题

编辑---针对您的新问题

所以,在实践中,如果我使用DDD,我仍然需要创建一个 浅层(贫血)对象模型,或DTO,用于在 表示层和服务(业务)层

那么,假设您必须构建一个MVC项目。
您的
控制器将处理请求,他们将调用
ModelBuilder
获取正确的
模型
,并将其返回到
视图

这取决于
ModelBuilder
调用您的
域服务。这些服务将返回您必须映射到
视图模型的域对象

如果您公开一些web服务,这将以某种方式起到相同的作用。
Web服务的契约是
接口
。这些契约定义了web服务公开的方法和被操作的对象(DTO)。这取决于实现契约接口的类调用您的
域服务
。这些服务将返回您必须映射到
DTO
的域对象

如果有什么好的参考应用或文章谈论 相似结构

DDD不是任何技术或体系结构。全部是:

定义域模型应该具有的普遍语言含义 形成领域专家给出的描述系统的通用语言 对于业务用户或 赞助商和软件开发人员


如果您想知道如何设计您的应用程序,请查看与JavaN-tiers体系结构相关的问题和文章

你所说的“网络会话”是什么意思?我的意思是:我和你一样有很多疑问,我认为基本问题始于建立正确的领域模型,这显然不必是贫乏的,也有一些行为。这是一个很好的起点:,我对DDD很感兴趣(这是一个快速的DDD方法学和实践之旅,由他的作者Eric Evans预设)。DDD显然是一种方法论,我的朋友,一种方法论,一种思维方式,由Eric Evans指出;我们不同意吗?它陈述了一种方法论,一种关于如何将一个系统分解为多个部分的全球视野,从逻辑上讲,它包含了工具(抽象工具)和技术。