Ardalis清洁架构:允许ContributorName仅含空白值是否为有意设计?
关于Ardalis Clean Architecture中ContributorName值对象验证逻辑的疑问
在Ardalis Clean Architecture示例中,ContributorName值对象的输入验证逻辑如下:
private static Validation Validate(in string name) => string.IsNullOrEmpty(name) ? Validation.Invalid("Name cannot be empty") : name.Length > MaxLength ? Validation.Invalid($"Name cannot be longer than {MaxLength} characters") : Validation.Ok;
由于使用了string.IsNullOrEmpty(),仅包含空白(如" "、"\t"或"\n")的值会被判定为有效。针对该实现有两个疑问:
- 该行为是否为有意设计?若是,请解释允许仅空白名称的领域或架构层面原因;
- 若不是,将其替换为
string.IsNullOrWhiteSpace()是否属于Bug修复而非行为变更?
注:本文旨在了解当前实现的设计意图,而非判断哪种方案更优。
解答
从领域驱动设计和Ardalis Clean Architecture的核心原则来看,仅允许空白名称通常不是该实现的有意设计,以下分两种情况说明:
若为有意设计的可能原因(少见)
- 特殊业务场景需求:某些业务中可能存在“匿名贡献者”的概念,允许用空白字符串作为标识,但这种场景会有明确的领域规则定义,不会作为默认逻辑出现;
- 架构分层的责任划分:若设计时将空白字符串的校验责任交给上游应用层,值对象仅做最基础的非空校验,这种做法属于架构层面的妥协,但不符合值对象“封装自身业务不变量”的核心设计原则。
若为无意疏漏,替换为string.IsNullOrWhiteSpace()属于Bug修复
- 原逻辑的核心意图是防止“无意义的空名称”,
string.IsNullOrEmpty()仅判断了空字符串或null,遗漏了空白字符串的情况,属于逻辑疏漏; - 替换操作是对齐原本的设计意图(确保名称具备实际业务含义),而非引入新的业务规则,因此不属于行为变更,而是Bug修复。
内容的提问来源于stack exchange,提问作者HoseiniPeyrov
相关产品推荐
相关产品推荐

