我正在尝试通过DDD开发Web应用程序。但在最佳实践中,我不确定是否应该将富域域对象直接放入Web会话中?例如:正如link建议的那样,它将EntityManager放到域对象中,我认为如果我想将域对象放入Web会话中则不好。
那么,您是否可以分享一些将DDD应用于Web应用程序的实际经验?特别是如何使用Web会话处理富域对象?是否有任何好的演示应用程序(通过Java)我可以参考?
谢谢, 利昂
亲爱的MikeSW,MaxS,感谢您的宝贵答案。
因此,在实践中,如果我使用DDD,我仍然需要创建浅层(贫血)对象模型或DTO,以在表示层和服务(业务)层之间共享数据。
我的理解是否正确?
如果有任何好的参考申请或文章谈论类似的架构,请告诉我。 我试图找到一些,但希望看到更多。
谢谢,Leon
答案 0 :(得分:4)
对于技术(资源浪费)和语义原因,不应将域对象(或任何复杂对象)放入Session。 Session不是一个Cache,而是一个tmeporary用户数据的持有者。将对象id存储在Session中,然后使用Repository检索实际对象。如果需要,存储库可以缓存内容。
答案 1 :(得分:3)
域对象与Presentation模型无关!
使用域驱动设计,您无需担心数据的显示方式和存储方式。您唯一需要关注的是为您的业务建模。
此外,将业务模型公开给前端用户并非最佳做法。他们不必知道您的业务如何运作,您的业务规则是什么或与业务相关的任何事情 这就是ViewModel或DTO的用途。这些是表示层实体,可以通过任何类型的Web服务显示或公开。
出于其他原因,让您的数据库模型看起来像您的业务模型不是一个好选择。数据库引擎必须处理其他问题,这些问题将导致您按照与设计域的方式不同的方式组织数据存储方式。
关于会议,请尽可能保持清晰。正如@MikeSW所说:
会话不是一个缓存
假设您要在Session中存储每个实体。它可能很容易达到约250kb。乍一看似乎并不大,但如果您的服务器受到10,000个不同用户的影响怎么办?你的会话规模将大幅增长到2,3Gb!仅限会话数据!这显然会导致性能问题。
编辑---为您的新问题
所以,在实践中,如果我使用DDD,我仍然需要创建一个 浅(贫血)对象模型,或DTO,以在之间共享数据 表示层和服务(业务)层。
好吧,假设你必须建立一个MVC项目
您的Controllers
会处理请求,他们会致电ModelBuilder
以获得正确的Model
并将其返回View
。
这取决于ModelBuilder
来致电Domain Services
。这些服务将返回您必须映射到View Model
的域对象。
如果你暴露了一些网络服务,这将以某种方式起作用
Web服务的合同为Interfaces
。这些合同定义了Web服务和被操纵对象(DTO)公开的方法。这取决于实现合同界面的类,以调用您的Domain Services
。这些服务将返回您必须映射到DTO
的域对象。
如果有任何好的参考申请或文章可以谈论 类似的架构
DDD不是任何技术或架构。这都是about:
定义无处不在的语言意味着域模型应该 形成领域专家给出的用于描述系统的通用语言 对企业用户或企业用户同样有效的要求 赞助商和软件开发商。
如果您想了解如何设计应用程序,请查看与Java n-tiers体系结构相关的SO问题和文章。