如何构建一个简单的REST应用程序(spring / hibernate)并考虑到DDD?

时间:2016-09-18 21:31:38

标签: java spring hibernate spring-data domain-driven-design

问题:

我想通过创建一个包含两个标签的简单webapp来利用我的DDD基础知识:

  1. 用户注册
  2. 已注册用户的列表
  3. 假设这是一个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)

    在我看来,有很多课程和很多混乱。所以这里有我的问题:

    1. 我应该如何摆脱地图绘制者?我的想法是:
      1. UserRegisterDTO有一个新方法:User getDomainObject()或类似的东西,UserViewDTO有一个新的构造函数:UserViewDTO(User user)
      2. 点1.1反转 - 用户有新构造函数User(UserRegisterDTO userDTO)和User有一个新方法UserViewDTO getUserViewDTO或类似的东西
      3. 坚持只是构造函数:所以User有新的构造函数User(UserRegisterDTO userDTO)和UserViewDTO有一个新的构造函数:UserViewDTO(User user)
    2. 让我们暂时退出UserToUserEntityMapper和UserEntityToUserMapper讨论

      1. 我认为分离"后端"对象来自" view"对象是个好主意,所以我要离开DTO。你同意吗?
      2. 根据我对DDD的理解 - 域对象应该能够自行处理。因此,假设我通过UserRegisterDTO.getDomainObject()在UserController中创建了一个新用户。所以要坚持下去,最好调用User.save(),我是否正确?
      3. 如果上述问题的答案是肯定的 - 我的用户应该将UserRepository注入用户,我是否正确?如果没有 - 我应该如何实现?如果是 - 构造函数注入在这里似乎是一个可怕的想法,因为我的用户可能是在DTO中创建的......
      4. 这也引出了一个问题 - 我应该将UserEntity与User分开吗?如果我这样做 - 我的持久层与我的域对象分离,这似乎是一个好主意,但也引入了一些问题(例如两者之间的映射)。所以重复一下这个问题:我应该将UserEntity与User分开吗?
      5. 和最后一个问题(现在是xd)是:假设所有上述问题都解决了,我是否应该摆脱我的UserService类?毕竟我的用户现在可以保存自己,并且可能有一个静态方法(或其他东西)来检索所有用户。如果要保留UserService(例如检索所有用户,因为静态方法很丑陋而且就是这样),如何确定哪些方法应该在UserService内部以及哪些内部用户?
      6. 总结这个非常长的帖子,里面只有零代码: 请通过回答上述问题帮助我了解DDD的基础知识。他们有数字是有原因的,所以如果你只想回答其中的一些 - 随意这样做:)

        提前感谢!

1 个答案:

答案 0 :(得分:-1)

我认为你对DDD概念有点困惑。 DDD更多地关注有限上下文的业务逻辑和抽象,而不是实现。不要对Web应用程序的域对象和域驱动设计的概念(如实体,值对象和聚合规则)感到困惑。

Here你有一个很棒的文件,我建议你阅读Eric J. Evans的书“领域驱动设计”,他是这个热学的创造者。

我希望它有所帮助