干货分享:DDD项目架构与充血模型实例

1 DDD

最近在学习领域驱动设计,同时也学习了COLA代码并进行了一些项目实践,COLA代码整洁优雅,但有一定学习成本和使用成本。最终一个工程思想还是要落地,我综合了一些DDD技术框架,删除了CQRS和事件总线模式,整理了一个简单实用易于落地的项目架构。

(1) demo-infrastructure

基础层。包含基础性功能,例如数据库访问功能,缓存访问功能,消息发送功能,还需要提供通用工具包

(2) demo-dependency

外部访问层。在这个模块中调用外部RPC服务,解析返回码和返回数据

(3) demo-domain

领域层。这个模块包含类似于三层架构的BO(Business Object),但不同的是使用充血模式进行定义,所以领域层本身也包含业务逻辑,不是简单进行属性声明

(4) demo-service

业务层。虽然领域层和业务层都包含业务,但是用途不同。业务层可以组合不同领域的业务,并且可以增加流控、监控、日志、权限控制切面,相较于领域层更为丰富

(5) demo-api

对外接口层。提供面向外部接口声明

(6) demo-controller

对外访问层。提供面向外部访问入口

2 三层架构与贫血模型

在使用上述框架之前我们一般使用三层架构进行业务开发:

Repository + Entity

Service + BO(Business Object)

Controller + VO(View Object)

复制代码

在三层架构业务开发中,大家经常使用基于贫血模型的开发模式。贫血模型是指业务逻辑全部放在service层,业务对象只包含数据不包含业务逻辑。我们来分析代码实例。

/**

* 账户业务对象

*

* @author 微信公众号「JAVA前线」

*

*/

public class AccountBO {

/**

* 账户ID

*/

private String accountId;

/**

* 账户余额

*/

private Long balance;

/**

* 是否冻结

*/

private boolean isFrozen;

public String getAccountId() {

return accountId;

}

public void setAccountId(String accountId) {

this.accountId = accountId;

}

public Long getBalance() {

return balance;

}

public void setBalance(Long balance) {

this.balance = balance;

}

public boolean isFrozen() {

return isFrozen;

}

public void setFrozen(boolean isFrozen) {

this.isFrozen = isFrozen;

}

}

/**

* 转账业务服务实现

*

* @author 微信公众号「JAVA前线」

*

*/

@Service

public class TransferServiceImpl implements TransferService {

@Autowired

private AccountService accountService;

@Override

public boolean transfer(String fromAccountId, String toAccountId, Long amount) {

你可能感兴趣的:(干货分享:DDD项目架构与充血模型实例)