Cola中提供了一种扩展点的机制,允许我们通过bizId(组织ID)、useCase(使用案例)、scenario(业务场景)三者动态的去选择实现类。有点类似与我们的策略模式,在程序运行的过程中,动态的选择实现类去处理我们的请求。

  • 定义扩展点接口,实现ExtensionPointI

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public interface OrganizationExtPt extends ExtensionPointI {
    /**
    * 根据corpId查询企业下所有部门
    *
    * @return 部门
    */
    String getDepartmentsByCorpId();
    }

  • 钉钉场景扩展点实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Extension(bizId = "organize",useCase = "getByCorpId",scenario = "dingTalk")
    public class DingTalkOrganizationExt implements OrganizationExtPt {

    @Override
    public String getDepartmentsByCorpId() {
    System.out.println("在组织结构业务,通过企业编号获取部门列表的用例,在钉钉的场景下业务的实现处理方式");
    System.out.println("通过钉钉的配置信息和API获取得到组织信息,并组装成云枢识别的部门信息");

    return "钉钉";
    }
    }
  • 微信扩展点接口实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Extension(bizId = "organize",useCase = "getByCorpId",scenario = "wechat")
    @Slf4j
    public class WechatOrganizationExt implements OrganizationExtPt{
    public String getDepartmentsByCorpId() {
    log.info("业务:组织机构,用例:通过企业编号获取部门 , 场景:企业微信");
    log.info("通过企业微信的API获取组织的部门信息,然后包装为需要的部门列表");

    return "微信";
    }
    }
  • 扩展点使用
    在命令执行器中使用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Component
    public class OrgazationQueryExe {
    @Resource
    private ExtensionExecutor extensionExecutor;

    public String execute(OrgnizationQry cmd) {
    return extensionExecutor.execute(OrganizationExtPt.class, cmd.getBizScenario(),
    ex -> ex.getDepartmentsByCorpId());
    }
    }
  • 测试扩展点的使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @RestController
    public class OrganizationController {

    @Resource
    private OrgazationQueryExe orgazationQueryExe;

    @GetMapping(value = "/organization/getDepartmentsByCorpId/{corpId}/{scenario}")
    public String listCustomerByName(@PathVariable("corpId") String corpId, @PathVariable("scenario") String scenario){

    OrgnizationQry qry = new OrgnizationQry();
    qry.setCorpId(corpId);
    qry.setIncludeDelete(true);
    qry.setBizScenario(BizScenario.valueOf("organize","getByCorpId",scenario));

    return orgazationQueryExe.execute(qry);
    }
    }