2016-09-18 50 views
1

问题:如何使用DDD构造一个简单的REST应用程序(spring/hibernate)?

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

  1. 用户注册
  2. 已注册的用户的列表

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


与贫血模型我可能会创建:

  • UserRegisterDTO(保存在标签1,可能与一些注释,如Hibernate验证或某些特定类型的映射)
  • UserViewDTO(在标签2检索)
  • 用户(与刚刚getter/setter方法,POJO贫血域对象)
  • UserEntity(由ORM明显使用,所有需要的注解@Entity,@Id等)
  • UserRegisterDTOToUse rMapper和UserToUserViewDTOMapper(我只是讨厌映射器......但是呃。你知道他们是什么用途; P)
  • UserController的
    • registerUser(UserRegisterDTO):它通过POST(由Spring从JSON反序列化)接收UserRegisterDTO,调用UserRegisterDTOToUserMapper,然后调用UserService返回一些愚蠢的字符串例如“用户创建”或“创建用户失败”等响应,该响应通过正确的http代码转发给客户端;
    • listAllUsers():它接收所有用户发出GET请求,调用UserService,调用UserToUserViewDTOMapper并返回UserViewDTOs的列表(由Spring序列化JSON)
  • UserToUserEntityMapper和UserEntityToUserMapper(N/C)
  • UserService
    • registerUser(用户):调用UserToUserEntityMapper然后UserRepository并且那它
    • listAllUsers():调用UserRepository然后UserToUserEntityMapper并且那它
  • UserRepository(接口扩展JpaRepository或诸如此类的东西,这是我们的数据库CRUD,包含所有花哨的方法,如listAll()和东西)

不少班,并在诸多乱象我的想法。所以这里来我的问题:

  1. 我应该如何摆脱映射?我的想法是:
    1. UserRegisterDTO有一个新的方法:用户getDomainObject()或类似的东西和UserViewDTO有一个新的构造:UserViewDTO(用户用户)
    2. 1.1点逆转 - 用户有新的构造用户(UserRegisterDTO userDTO )和用户有一个新的方法UserViewDTO getUserViewDTO或类似的东西
    3. 棒只是构造函数:所以用户有新的构造用户(UserRegisterDTO userDTO)和UserViewDTO有一个新的构造:UserViewDTO(用户用户)

让离开UserToUserEntityMapper和UserEntityToUserMapper了讨论,现在

  • 我认为,从“查看”对象分开“后端”的对象是一个好主意,所以我会离开的DTO 。你同意吗?
  • 从我对DDD的理解 - 域对象应该能够自己照顾自己。因此,可以说我通过UserRegisterDTO.getDomainObject()在UserController中创建了一个新用户。所以要坚持下去,最好调用User.save(),我是否正确?
  • 如果上述问题的答案是肯定的 - 我的用户可能应该将UserRepository注入到用户中,我是否正确?如果没有 - 我应该如何执行?如果是的话 - 构造函数注入看起来像一个可怕的想法,因为我的用户可能会创建在一个DTO ...
  • 这也导致一个问题 - 我真的应该分离UserEntity从用户吗?如果我这样做 - 我的持久层与我的域对象分离,这似乎是一个好主意,但也引入了一些问题(例如两者之间的映射)。所以重复这个问题:我是否应该将UserEntity从用户中分离出来?
  • 和最后一个问题(现在xd)是:让我们假设所有上述问题都解决了,我也应该摆脱我的UserService类?毕竟我的用户现在可以保存自己,并可能有一个静态方法(或其他)来检索所有用户。如果UserService在这里(例如,检索所有用户,因为静态方法很丑陋,多数民众赞成它)如何确定哪些方法应该在UserService和哪些内部用户?
  • 总结这个非常长的职位,其中完全没有代码: 请回答上述问题,帮助我了解DDD的基本知识。他们有一个理由的数字,所以如果你只想回答其中的一些 - 随时做到这一点:)

    在此先感谢!

    回答

    0

    我想你对DDD概念有点困惑。 DDD更侧重于有限上下文的业务逻辑和抽象而非实现。不要被Web应用程序的域对象和域驱动设计的概念所困惑,如实体,值对象和聚合规则。

    Here你有一个关于它的令人敬畏的文档,并且我建议你阅读Eric J. Evans的书“Domain Driven Design”,他是这种therminology的创造者。

    我希望它有帮助

    +0

    嘿,谢谢你的回答。我目前正在阅读Vernon Vaughn实施DDD,是的,我有点困惑:)我明白这是关于业务逻辑和有界的上下文抽象,但要做到这一点,你必须有一些坚实的架构,这是它的地方让我惊叹。 – WrRaThY

    相关问题