六边形架构,适配器

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

前言

六边形架构如图下所示,这个架构是在公司跟大师学到的一个开发架构问题,他所带来的好处对于开发是很流畅的,在当下业务驱动技术的时代,一切都要以业务为主,当然六边形的架构就是随着不断地演进,从最初的三层一直演进到现在的DDD领域驱动设计。

image.png

什么是六边形

六边形正如上图所示,没有死角全是一个适配器,不管数据从哪里进来都可以经过中间的应用层,从而达到需要的数据,六个边都是适配器,把每一个应用的出口都抽象化,不管是谁只要实现整个抽象接口,那么你就可以使用这套业务逻辑代码,而不需要动所有的代码。而在这这种重点是一个名为端口的东西,端口就是应用的入口和出口,在我们公司采用三层架构,架构如下Api层,App层,domain层,infra层。

核心架构四层

Api层,接口层放置 controller 与 eventHandler位于六边形的入口

App层,业务层 service 与 service impl的业务层,用于对数据加工做业务处理

domain层,领域层 service 与 service impl的业务层,用于对数据加工做业务处理,不同的是这一层的粒度比上一层app粒度会更细

infra层,基础设施层,也叫防腐层,第三方的实现方式在此处放置,他也是六边形的出口

六边形的架构其实是想达到infra可以入,api可以入。中间service业务可以抽离的思想。

这里重点讲下infra层,infra层是一个尤为重要层,他又被成为防腐层,所谓防腐层是什么,他就是拿来隔离业务代码与第三方包的分界线,如果你的业务代码卸载了infra层,那么你的六边形架构除非在往下抽离一层,否则你这个业务代码会与第三方包特别的耦合。

这里我给大家看个例子就懂了。

-----------下面代码为 app层-----------
@Override
public List<AquafarmDto> getByUserId(Long tenantId, Long userId) {

    List<AquafarmDto> dtos = new ArrayList<>();

    List<Aquafarm> aquafarmList = business.getByUserId(tenantId, userId);

    for (Aquafarm aquafarm : aquafarmList) {
        AquafarmDto dto = new AquafarmDto();
        List<Fish> fishList = fishBusiness.getByAquafarmId(aquafarm.getTenantId(), aquafarm.getId());

        dto.setAquafarm(aquafarm);
        dto.setFishStr(fishList.stream().map(Fish::getFishName).collect(Collectors.joining(",")));
        dtos.add(dto);
    }

    return dtos;
}

-----------下面代码为 domain层-----------
@Override
public List<Fish> getByUserId(Long tenantId, Long userId) {
    return repository.getByUserId(tenantId, userId);
}


-----------下面代码为 infra层-----------
@Override
public List<Fish> getByUserId(Long tenantId, Long userId) {
    return fishMapper.getByUserId(tenantId, userId);
}
复制代码

总结

通过上面代码可以看出infra层抽离了与业务不相关的mybatis层,充当了防腐层,mybatis并没有侵入到我的业务当中,如果我那天不想用mhybatis了我想换个框架,甚至我要用原生jdbc去操作数据,那我也只需要实现infra层的接口就行,大家看到这里是不是觉得恍然大悟呢。

猜你喜欢

转载自juejin.im/post/7034495653333958670