问题:
我想通过创建一个包含两个标签的简单webapp来利用我的DDD基础知识:
- 用户注册
- 已注册用户的列表
醇>
假设这是一个REST应用程序,所以我们只发送和接收JSON数据
贫血模型我可能会创建:
- UserRegisterDTO(保存在选项卡1中,可能带有一些注释,如hibernate验证或某些特定类型映射)
- UserViewDTO(在标签2中检索)
- 用户(贫血域名对象只有getter / setter,POJO)
- UserEntity(显然由ORM使用,包含所有需要的注释@ Entity,@ Id等)
- UserRegisterDTOToUserMapper和UserToUserViewDTOMapper(我只是讨厌mappers ...但是呃。你知道它们用于什么; p)
- UserController中
- registerUser(UserRegisterDTO):它通过POST接收UserRegisterDTO(由Spring从JSON反序列化),调用UserRegisterDTOToUserMapper,然后调用UserService,返回一些愚蠢的String响应,如" User created"或"无法创建用户",使用正确的http代码转发到客户端;
- listAllUsers():它接收所有用户的GET,调用UserService,调用UserToUserViewDTOMapper并返回UserViewDTO列表(由Spring序列化为JSON)
- UserToUserEntityMapper和UserEntityToUserMapper(n / c)
- UserService
- registerUser(User):调用UserToUserEntityMapper然后调用UserRepository就可以了
- listAllUsers():调用UserRepository,然后调用UserToUserEntityMapper,那就是
- UserRepository(扩展JpaRepository的接口或诸如此类的,这是我们的数据库CRUD,包含所有奇特的方法,如listAll()和stuff)
在我看来,有很多课程和很多混乱。所以这里有我的问题:
- 我应该如何摆脱地图绘制者?我的想法是:
- UserRegisterDTO有一个新方法:User getDomainObject()或类似的东西,UserViewDTO有一个新的构造函数:UserViewDTO(User user)
- 点1.1反转 - 用户有新构造函数User(UserRegisterDTO userDTO)和User有一个新方法UserViewDTO getUserViewDTO或类似的东西
- 坚持只是构造函数:所以User有新的构造函数User(UserRegisterDTO userDTO)和UserViewDTO有一个新的构造函数:UserViewDTO(User user)
醇>
让我们暂时退出UserToUserEntityMapper和UserEntityToUserMapper讨论
- 我认为分离"后端"对象来自" view"对象是个好主意,所以我要离开DTO。你同意吗?
- 根据我对DDD的理解 - 域对象应该能够自行处理。因此,假设我通过UserRegisterDTO.getDomainObject()在UserController中创建了一个新用户。所以要坚持下去,最好调用User.save(),我是否正确?
- 如果上述问题的答案是肯定的 - 我的用户应该将UserRepository注入用户,我是否正确?如果没有 - 我应该如何实现?如果是 - 构造函数注入在这里似乎是一个可怕的想法,因为我的用户可能是在DTO中创建的......
- 这也引出了一个问题 - 我应该将UserEntity与User分开吗?如果我这样做 - 我的持久层与我的域对象分离,这似乎是一个好主意,但也引入了一些问题(例如两者之间的映射)。所以重复一下这个问题:我应该将UserEntity与User分开吗?
- 和最后一个问题(现在是xd)是:假设所有上述问题都解决了,我是否应该摆脱我的UserService类?毕竟我的用户现在可以保存自己,并且可能有一个静态方法(或其他东西)来检索所有用户。如果要保留UserService(例如检索所有用户,因为静态方法很丑陋而且就是这样),如何确定哪些方法应该在UserService内部以及哪些内部用户?
醇>
总结这个非常长的帖子,里面只有零代码:
请通过回答上述问题帮助我了解DDD的基础知识。他们有数字是有原因的,所以如果你只想回答其中的一些 - 随意这样做:)
提前感谢!