前言:
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 框架等,让整个架构更利于互联网开发。