gpt4 book ai didi

java - 如何在考虑DDD的基础上构建一个简单的REST应用( Spring / hibernate )?

转载 作者:行者123 更新时间:2023-12-01 06:08:31 26 4
gpt4 key购买 nike

问题:

我想通过创建一个具有两个选项卡的简单Web应用程序来利用DDD基础知识:


用户注册
已注册用户的列表


让我们假设这是一个REST应用,所以我们只发送和接收JSON数据



使用贫血模型,我可能会创建:


UserRegisterDTO(保存在标签1中,可能带有一些注释,例如休眠验证或某些特定的类型映射)
UserViewDTO(在选项卡2中检索)
用户(带有getter / setter的贫血领域对象,POJO)
UserEntity(显然由ORM使用,带有所有必需的注释@ Entity,@ Id等)
UserRegisterDTOToUserMapper和UserToUserViewDTOMapper(我只是讨厌映射器...但是eh。您知道它们用于; p)
UserController


registerUser(UserRegisterDTO):它通过POST(通过Spring从JSON反序列化)接收UserRegisterDTO,调用UserRegisterDTOToUserMapper,然后调用UserService,该服务返回一些愚蠢的字符串响应,例如“用户创建”或“无法创建用户”,然后转发给客户使用正确的http代码;
listAllUsers():它接收所有用户的GET,调用UserService,调用UserToUserViewDTOMapper并返回UserViewDTO列表(Spring将其序列化为JSON)

UserToUserEntityMapper和UserEntityToUserMapper(n / c)
用户服务


registerUser(User):调用UserToUserEntityMapper,然后调用UserRepository,就是这样
listAllUsers():调用UserRepository,然后调用UserToUserEntityMapper,就是这样

UserRepository(扩展JpaRepository或其他功能的接口,这是我们的数据库CRUD,包含所有喜欢的方法,如listAll()和东西)




我认为相当多的课程和很多混乱的情况。所以这是我的问题:


我应该如何摆脱制图员?我的想法是:


UserRegisterDTO有一个新方法:User getDomainObject()或类似的东西,而UserViewDTO有一个新的构造函数:UserViewDTO(User user)
要点1.1颠倒了-用户具有新的构造函数User(UserRegisterDTO userDTO),而用户具有新的方法UserViewDTO getUserViewDTO或类似的方法
坚持只使用构造函数:因此User具有新的构造函数User(UserRegisterDTO userDTO),而UserViewDTO具有新的构造函数:UserViewDTO(User user)



让我们暂时将UserToUserEntityMapper和UserEntityToUserMapper排除在讨论之外


我认为将“后端”对象与“视图”对象分开是一个好主意,因此我将保留DTO。你同意吗?
根据我对DDD的了解,域对象应该能够照顾好自己。因此,可以说我通过UserRegisterDTO.getDomainObject()在UserController中创建了一个新用户。因此,要坚持下去,最好调用User.save(),对吗?
如果上述问题的答案是肯定的-我的用户可能应该将UserRepository注入了用户,我是否正确?如果不是,我应该如何实施?如果是,在这里构造函数注入似乎是一个糟糕的主意,因为我的用户可能是在DTO中创建的...
这也引发了一个问题-我真的应该将UserEntity与User分开吗?如果这样做-我将持久层与域对象分开,这似乎是个好主意,但同时也会带来一些问题(例如,两者之间的映射)。因此,重复这个问题:我是否应该将UserEntity与User真正分开?
最后一个问题(现在是xd)是:假设上述所有问题都已解决,是否还应该摆脱UserService类?毕竟,我的用户现在可以保存自己,并且可以使用静态方法(或其他方法)来检索所有用户。并且如果UserService停留在这里(例如,检索所有用户,因为静态方法很丑陋,那就如此)如何确定应在UserService中使用哪些方法以及在User内部使用哪些方法?


总结这段篇幅非常长的文章,其中代码完全为零:
请回答上述问题,以帮助我了解DDD的基础知识。他们有一个数字是有原因的,因此,如果您只想回答其中一些数字,请随意这样做:)

提前致谢!

最佳答案

我认为您对DDD概念有些困惑。
DDD的重点是业务逻辑和有界上下文的抽象,而不是实现。不要将Web应用程序的域对象与域驱动设计的概念(例如实体,值对象和聚合规则)相混淆。

Here您有一个很棒的文档,我建议您阅读Eric J. Evans的著作“ Domain Driven Design”,他是该技术的创造者。

希望对您有所帮助

关于java - 如何在考虑DDD的基础上构建一个简单的REST应用( Spring / hibernate )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com