在ApplicationService中,经常会依赖外部服务,从代码层面对外部系统产生了依赖。比如:
ItemDO item = itemService.getItem(cmd.getItemId());
boolean withholdSuccess = inventoryService.withhold(cmd.getItemId(), cmd.getQuantity());
会发现我们的ApplicationService会强依赖ItemService、InventoryService以及ItemDO这个对象。如果任何一个服务的方法变更,或者ItemDO字段变更,都会有可能影响到ApplicationService的代码。也就是说,我们自己的代码会因为强依赖了外部系统的变化而变更,这个在复杂系统中应该是尽量避免的。那么如何做到对外部系统的隔离呢?需要加入ACL防腐层。用外观模式(Facade)将外部包一层提供给内部使用,包括接口、DTO,后续外部接口或者返回字段变动主逻辑不需要修改仅需修改对应的facade
ACL防腐层的简单原理如下:
• 对于依赖的外部对象,我们抽取出所需要的字段,生成一个内部所需的VO或DTO类
• 构建一个新的Facade,在Facade中封装调用链路,将外部类转化为内部类
• 针对外部系统调用,同样的用Facade方法封装外部调用链路
网友评论