DDD在第三方rpc查询接口中的使用

前言

一个理论:DDD可以创建获取模型数据
一个问题:通过rpc接口获取数据往往不是我们需要的还需要加工处理
一个设想:直接通过一个重用领域去拿到我们需要的东西

需求

1.获取用户权益过期时间,获取用户对于权益状态(从未购买,过期,生效)
2.已知rpc提供权益状态和权益时间

设计

在这里插入图片描述

1基础设施层

UserRightsRepository 此方法实现获取第三方rpc 返回对象

/**
 * <h3> 基础设施层  用户权益Dao</h3>
 */
@Slf4j
@Service
public class UserRightsRepository {
    @Autowired
    private UserRightApi userRightApi;

    public List<UserRightDTO> getBuyerUserRightsList(Long customerId, List<Integer> rightsCodeList) {
        QueryCondition queryCondition = new QueryCondition();
        List<UserRightDTO> userRightDTOList;
        try {
            userRightDTOList = userRightApi.findList(queryCondition);
        } catch (Exception e) {
            log.error("userRightApi findList error customerId {} rightsCodeList {}",customerId ,rightsCodeList,e);
            throw new RuntimeException(e);
        }
        return userRightDTOList;
    }


    public RightsDTO getUserRights(Long customerId, String rightsCode) {
        RightsQueryDTO rightsQueryDTO = new RightsQueryDTO();
        Map<String, RightsDTO> stringRightsDTOMap;
        try {
            stringRightsDTOMap = userRightApi.userRightsDetail(rightsQueryDTO);
        } catch (Exception e) {
            log.error("userRightApi userRightsDetail error  customerId {} rightsCode {}", customerId, rightsCode, e);
            throw new RuntimeException(e);
        }
        if (MapUtils.isEmpty(stringRightsDTOMap)) {
            log.error("userRightApi userRightsDetail 获取权益 error  customerId {} rightsCode {}", customerId, rightsCode);
            return null;
        }
        RightsDTO rightsDTO = stringRightsDTOMap.get(rightsCode);
        if (Objects.isNull(rightsDTO)) {
            log.error("userRightApi userRightsDetail 获取权益 error  customerId {} rightsCode {}", customerId, rightsCode);
            return null;
        }
        return rightsDTO;
    }
}

2领域对象 充血模型

/**
 * <h3>用户权益状态枚举值</h3>
 */
public enum UserRightsStautsEnum {
    outDate("outDate","过期"),
    noBuy("noBuy","从来没购买过"),
    inDate("inDate","生效");
    // 描述信息(备注)
    private String type;
    // 获取信息value 第三方对应字段
    private String desc;

    UserRightsStautsEnum(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}


@Slf4j
@Data
public class UserRightsRemainDayDomain {

    private Integer remainDay;

    private UserRightsStautsEnum userRightsStautsEnum;

    public void setUserRightsStautsEnum(RightsDTO rightsDTO) {
        this.userRightsStautsEnum = UserRightsStautsEnum.inDate;
       //根据字段填充类型
    }

    public void setRemainDay(RightsDTO rightsDTO) {
        this.remainDay = Math.toIntExact((endTime - currentSecond) / 86400 + 1);
        //根据字段填充
    }
    
    public void fillByUserRightDTOList(List<UserRightDTO> userRightDTOList) {
        this.userRightsStautsEnum = UserRightsStautsEnum.inDate;
        this.remainDay = Math.toIntExact((endTime - currentSecond) / 86400 + 1);
    }
}

3仓库

/**
 * <h3>用户权益剩余时间 仓库</h3>
 */
@Service
public class UserRightsRemainDayRepository {

    @Autowired
    private UserRightsRepository userRightsRepository;

    public UserRightsRemainDayDomain getUserRightsRemainDay(Long customerId, String rightsCode){
        UserRightsRemainDayDomain userRightsRemainDayDomain = new UserRightsRemainDayDomain();
        RightsDTO rightsDTO;
        try {
            rightsDTO = userRightsRepository.getUserRights(customerId, rightsCode);
        } catch (Exception e) {
            return null;
        }
        if(Objects.isNull(rightsDTO)){
            return null;
        }
        userRightsRemainDayDomain.setUserRightsStautsEnum(rightsDTO);
        userRightsRemainDayDomain.setRemainDay(rightsDTO);
        return userRightsRemainDayDomain;
    }
    
    //获取一批权益的状态和生效时间 只要有一个权益的最后结束时间>现在 就在有效期
    public UserRightsRemainDayDomain getUserRightsListRemainDay(Long customerId, List<Integer> rightsIdList){
        List<UserRightDTO>  userRightDTOList;
        try {
            userRightDTOList = userRightsRepository.getBuyerUserRightsList(customerId, rightsIdList);
        } catch (Exception e) {
            return null;
        }
        UserRightsRemainDayDomain userRightsRemainDayDomain = new UserRightsRemainDayDomain();
        userRightsRemainDayDomain.fillByUserRightDTOList(userRightDTOList);
        return userRightsRemainDayDomain;
    }
}

4使用

    @Override
    public Integer getRightsOrderRemainDay(Long customerId) {
        UserRightsRemainDayDomain userRightsListRemainDay = userRightsRemainDayRepository.getUserRightsRemainDay(customerId, UserRightsRpc.RightsCode.CHAT_MEMBER_PURCHASEORDER);
        if(Objects.isNull(userRightsListRemainDay) || NumberExtendUtil.isNull(userRightsListRemainDay.getRemainDay())){
            return -99999;
        }
        return userRightsListRemainDay.getRemainDay();
    }

4 对比DDD 和 业务编程

1.DDD隔离了第三方api可以对第三方api的报错限流降级处理
2.DDD对于每一个属性赋值更加清晰 业务编程也可以使用填充对象的方式清晰对象赋值
3.DDD可能会导致有部分代码冗余执行,且有部分逻辑代码因为写在充血模型里面,无法重用

总结:DDD 对于之前 再写个类进行业务编程来说,更加的降维打击,用在变化的业务上也能更加顺畅,可以依据这个思想简化ifelse,依据DDD思想开发后流程图已经无法适用代码逻辑

展望

定时任务工具类中是否可用DDD来简化业务定时任务的流程

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在旅游电商架构的演进DDD(领域驱动设计)的实践起到了重要的作用。 首先,DDD强调将业务领域作为系统设计的核心。旅游电商平台涉及众多业务领域,如订单管理、支付、产品推荐等等,而DDD通过将不同领域划分为领域模型,使得系统的开发变得清晰明了。每个领域模型都由领域专家来定义,通过与业务专家深入交流,能够更好地理解业务需求,进而更高效地开发实现相应的功能。 其次,DDD通过建立领域模型的约束边界,实现了应用架构的松耦合。在旅游电商系统,不同的领域间存在复杂的关系和依赖,如果没有明确的边界,不同领域的变更可能会导致系统其他部分的不必要改动。而DDD通过定义明确的边界和接口,使得不同领域可以独立地演进和变化,减少了系统间的耦合性,提高了系统的可维护性和扩展性。 另外,DDD还提倡将业务逻辑尽可能地转移到领域模型实现。旅游电商系统的各种业务规则和逻辑非常复杂,如果将其分散在各个服务或者界面,将会导致系统难以理解和维护。而将业务规则集在领域模型,可以使得系统的逻辑更加清晰,便于开发和维护。同时,领域模型的聚合根还可以通过封装和暴露合适的行为,提供领域专家可以理解和操作的接口。 总之,DDD在旅游电商架构的实践起到了重要的作用。它不仅帮助开发团队更深入地理解业务需求,还提供了一种有效的架构设计和开发方法,使得旅游电商系统更加稳定、可维护和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值