处理 DDD 中的多态行为

Tackling polymorphic behaviour in a DDD

有一个Credentialclass包含数字Proof的场景。每种类型的 Credential 都可以支持多种不同类型的 Proof,例如 JWSProof 或从相同基数 class (Proof) 派生的简单 RSASignatureProof并指定不同的行为来进行验证。

假设客户端发送包含 JWS 证明的凭据,在收到数据后,控制器端点将其映射到 Credential(最终可能会在之后存储)并以某种方式识别包含的证明类型在里面。它的任务是在处理(或保存)之前对其进行验证,因此它应该使用相关 class(在本例中为 JWSProof)中实现的逻辑,方法是在收集密码后使用工厂构造它 material 需要进行验证。

所以我的问题是:你认为这是正确的做法吗?我觉得 JWSProof 有点没用,因为它的逻辑很容易变成静态函数。您将如何对这种情况进行建模以及需要多少存储库来存储所有这些类型的 objects/classes?

对于不需要更改的纯计算逻辑(我建议证明算法就是这样的东西:它可能没有从验证到验证的状态),源代码(例如静态函数)是正确的存储库。

你的 ProofRepository 从根本上说只是一个从证明的标识符(例如像 "JWSProof" 这样的字符串)到静态函数(不同的语言会使它更容易或更难建模)的映射,尤其是当证明实现需要采用不同的参数时)。

出于同样的原因,您可能拥有特定证明所需的加密材料的存储库。

根据您的解释(请参阅问题评论),每种类型的 Proof 在数据结构方面对相同类型的输入数据进行操作(在您的情况下只是一个字符串) 我们只关心不同的证明验证逻辑。

这听起来像 Proof 更像是仅行为(逻辑),并不表示域模型中的数据。这就是为什么我建议通过 strategy pattern 来处理这个问题。这意味着有一个策略实现包含每种不同类型证明的验证逻辑。我不建议使用静态方法,因为这会使测试和维护变得困难。

您可以实现一个凭据工厂,它创建相应的凭据聚合并且已经根据 [=19] 注入特定的 证明策略 =]证明类型.

如果此解决方案对您的问题可行,您甚至不需要不同的凭据 class 类型,因为证明逻辑不同。因为当 存储 Credential aggregate 它总是有结构相同,只有证明类型的值(例如,为强类型创建自定义 ProofType 值对象)不同。