Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当您公开公共API时,如何处理不变量(业务规则)中的破坏性更改_Api_Domain Driven Design - Fatal编程技术网

当您公开公共API时,如何处理不变量(业务规则)中的破坏性更改

当您公开公共API时,如何处理不变量(业务规则)中的破坏性更改,api,domain-driven-design,Api,Domain Driven Design,我开始研究关于公共API的良好实践,特别是关于如何处理破坏性的更改。有很多与版本控制(或非版本控制!)相关的技术细节,但我更感兴趣的是代码库的含义 设想一个基本场景,其中有一条业务规则“密码必须至少有10个字符”。您在公共API中公开了一个“创建用户”场景,接受密码 您有数百个客户端在使用它,有一天,您决定将业务规则更改为“密码必须至少包含15个字符”。即使您没有更改API签名和有效负载的语义,您也只是在API中引入了突破性的更改,因为您更改了此API的行为 你会怎么处理这件事 我只发现错误的方

我开始研究关于公共API的良好实践,特别是关于如何处理破坏性的更改。有很多与版本控制(或非版本控制!)相关的技术细节,但我更感兴趣的是代码库的含义

设想一个基本场景,其中有一条业务规则“密码必须至少有10个字符”。您在公共API中公开了一个“创建用户”场景,接受密码

您有数百个客户端在使用它,有一天,您决定将业务规则更改为“密码必须至少包含15个字符”。即使您没有更改API签名和有效负载的语义,您也只是在API中引入了突破性的更改,因为您更改了此API的行为

你会怎么处理这件事

我只发现错误的方法:

  • 用过时/版本连接的不变量修改域不变量(业务规则):这将在代码可读性/测试等方面造成噩梦
  • 复制每个API版本的代码库:这会造成维护噩梦
  • 希望有一天你能摒弃这一切,重新变得干净:在你的梦中

  • 在你的工作中有没有关于这方面的实际经验?

    最简单的方法就是与你的客户沟通,并在几周/几个月前提醒他们即将发生的变化。通过这种方式,他们可以为突破性的变化做好准备

    如果您绝对必须支持旧客户端,另一个选项是将域保持不变为10,但为create user场景添加一个额外的api调用,用于检查密码长度并验证密码在域外的长度为15。然后,鼓励用户迁移到新的CreateUser端点。这适用于像这样的简单情况,但对于复杂的不变量,或者如果您的域用于不同的上下文(多个API、桌面应用程序等),则很难做到这一点


    如果您决定采用这种方法,一个好的技巧是确保您有指标来了解有多少客户端使用旧端点,有多少客户端使用新端点。当您达到某个阈值时,您可以关闭旧端点并将最小密码长度15不变量从Api移动到域,

    最简单的方法就是与您的客户端通信,并在几周/几个月前警告他们即将发生的更改。通过这种方式,他们可以为突破性的变化做好准备

    如果您绝对必须支持旧客户端,另一个选项是将域保持不变为10,但为create user场景添加一个额外的api调用,用于检查密码长度并验证密码在域外的长度为15。然后,鼓励用户迁移到新的CreateUser端点。这适用于像这样的简单情况,但对于复杂的不变量,或者如果您的域用于不同的上下文(多个API、桌面应用程序等),则很难做到这一点

    如果您决定采用这种方法,一个好的技巧是确保您有指标来了解有多少客户端使用旧端点,有多少客户端使用新端点。当达到某个阈值时,可以关闭旧端点,并将最小密码长度15不变量从Api移动到域