关于ddd:DDD领域驱动设计思想解读及优秀实践吾爱fen享

54次阅读

共计 4131 个字符,预计需要花费 11 分钟才能阅读完成。

前言:

download:DDD(畛域驱动设计)思维解读及优良实际

下载课程 ZY:https://www.97yrbl.com/t-1317.html

开发环境

jdk1.8【jdk1.7 以下只能局部反对 netty】
springboot 2.0.6.RELEASE
idea + maven

五、代码示例

itstack-demo-ddd-01
└── src
    ├── main
    │   ├── java
    │   │   └── org.itstack.demo
    │   │       ├── application
    │   │       │    ├── event
    │   │       │    │   └── ApplicationRunner.java    
    │   │       │    └── service
    │   │       │        └── UserService.java    
    │   │       ├── domain
    │   │       │    ├── model
    │   │       │    │   ├── aggregates
    │   │       │    │   │   └── UserRichInfo.java    
    │   │       │    │   └── vo
    │   │       │    │       ├── UserInfo.java    
    │   │       │    │       └── UserSchool.java    
    │   │       │    ├── repository
    │   │       │    │   └── IuserRepository.java    
    │   │       │    └── service
    │   │       │        └── UserServiceImpl.java    
    │   │       ├── infrastructure
    │   │       │    ├── dao
    │   │       │    │   ├── impl
    │   │       │    │   │   └── UserDaoImpl.java    
    │   │       │    │   └── UserDao.java    
    │   │       │    ├── po
    │   │       │    │   └── UserEntity.java    
    │   │       │    ├── repository
    │   │       │    │   ├── mysql
    │   │       │    │   │   └── UserMysqlRepository.java
    │   │       │    │   ├── redis
    │   │       │    │   │   └── UserRedisRepository.java        
    │   │       │    │   └── UserRepository.java    
    │   │       │    └── util
    │   │       │        └── RdisUtil.java
    │   │       ├── interfaces
    │   │       │    ├── dto
    │   │       │    │    └── UserInfoDto.java    
    │   │       │    └── facade
    │   │       │        └── DDDController.java
    │   │       └── DDDApplication.java
    │   ├── resources    
    │   │   └── application.yml
    │   └── webapp    
    │       └── WEB-INF
    │            └── index.jsp    
    └── test
         └── java
             └── org.itstack.demo.test
                 └── ApiTest.java
application/UserService.java | 应用层用户服务,畛域层服务做具体实现
/**
 * 应用层用户服务
 * 虫洞栈:https://bugstack.cn
 * 公众号:bugstack 虫洞栈 | 欢送关注并获取更多专题案例源码
 * Create by fuzhengwei on @2019
 */
public interface UserService {UserRichInfo queryUserInfoById(Long id);

}

domain/repository/IuserRepository.java | 畛域层资源库,由根底层实现
/**

  • 虫洞栈:https://bugstack.cn
  • 公众号:bugstack 虫洞栈 | 欢送关注并获取更多专题案例源码
  • Create by fuzhengwei on @2019
    */

public interface IUserRepository {

void save(UserEntity userEntity);

UserEntity query(Long id);

}
domain/service/UserServiceImpl.java | 应用层实现类,应用层是很薄的一层能够只做服务编排
/**

  • 虫洞栈:https://bugstack.cn
  • 公众号:bugstack 虫洞栈 | 欢送关注并获取更多专题案例源码
  • Create by fuzhengwei on @2019
    */

@Service(“userService”)
public class UserServiceImpl implements UserService {

@Resource(name = "userRepository")
private IUserRepository userRepository;

@Override
public UserRichInfo queryUserInfoById(Long id) {
    
    // 查问资源库
    UserEntity userEntity = userRepository.query(id);

    UserInfo userInfo = new UserInfo();
    userInfo.setName(userEntity.getName());

    // TODO 查问学校信息,内部接口
    UserSchool userSchool_01 = new UserSchool();
    userSchool_01.setSchoolName("振华高级试验中学");

    UserSchool userSchool_02 = new UserSchool();
    userSchool_02.setSchoolName("西南电力大学");

    List<UserSchool> userSchoolList = new ArrayList<>();
    userSchoolList.add(userSchool_01);
    userSchoolList.add(userSchool_02);

    UserRichInfo userRichInfo = new UserRichInfo();
    userRichInfo.setUserInfo(userInfo);
    userRichInfo.setUserSchoolList(userSchoolList);

    return userRichInfo;
}

}
infrastructure/po/UserEntity.java | 数据库对象类
/**

  • 数据库实体对象;用户实体
  • 虫洞栈:https://bugstack.cn
  • 公众号:bugstack 虫洞栈 | 欢送关注并获取更多专题案例源码
  • Create by fuzhengwei on @2019
    */

public class UserEntity {

private Long id;
private String name;

get/set ...

}
infrastructrue/repository/UserRepository.java | 畛域层定义接口,根底层资源库实现
/**

  • 虫洞栈:https://bugstack.cn
  • 公众号:bugstack 虫洞栈 | 欢送关注并获取更多专题案例源码
  • Create by fuzhengwei on @2019
    */

@Repository(“userRepository”)
public class UserRepository implements IUserRepository {

@Resource(name = "userMysqlRepository")
private IUserRepository userMysqlRepository;

@Resource(name = "userRedisRepository")
private IUserRepository userRedisRepository;

@Override
public void save(UserEntity userEntity) {
    // 保留到 DB
    userMysqlRepository.save(userEntity);

    // 保留到 Redis
    userRedisRepository.save(userEntity);
}

@Override
public UserEntity query(Long id) {UserEntity userEntityRedis = userRedisRepository.query(id);
    if (null != userEntityRedis) return userEntityRedis;

    UserEntity userEntityMysql = userMysqlRepository.query(id);
    if (null != userEntityMysql){
        // 保留到 Redis
        userRedisRepository.save(userEntityMysql);
        return userEntityMysql;
    }

    // 查问为 NULL
    return null;
}

}
interfaces/dto/UserInfoDto.java | DTO 对象类,隔离数据库类
/**

  • 虫洞栈:https://bugstack.cn
  • 公众号:bugstack 虫洞栈 | 欢送关注并获取更多专题案例源码
  • Create by fuzhengwei on @2019
    */

public class UserInfoDto {

private Long id;        // ID

public Long getId() {return id;}

public void setId(Long id) {this.id = id;}

}
interfaces/facade/DDDController.java | 门面接口
/**

@Controller
public class DDDController {

@Resource(name = "userService")
private UserService userService;

@RequestMapping("/index")
public String index(Model model) {return "index";}

@RequestMapping("/api/user/queryUserInfo")
@ResponseBody
public ResponseEntity queryUserInfo(@RequestBody UserInfoDto request) {return new ResponseEntity<>(userService.queryUserInfoById(request.getId()), HttpStatus.OK);
}

}

六、综上总结

以上基于 DDD 一个根本入门的构造演示实现,理论开发能够依照此模式进行调整。
目前这个架构分层还不能很好的进行拆散,以及层级关系的援用还不利于扩大。
后续会继续欠缺以及能够组合搭建 RPC 框架等,让整个架构更利于互联网开发。

正文完
 0