正如 DDD 从业者建议的那样,业务规则的验证必须在域对象(实体、值对象和域服务)内实现,并且在我读过的某个地方也遵循它们自己的上下文,我们应该进行技术验证(例如检查长度、正确的输入格式、正确的数据类型,...)在域模型之外和应用层之类的地方,以保持域对象清晰。
现在 我的问题是:
如果我们有信用卡号的值对象,我们是否仍应将技术验证排除在值对象之外?换句话说,当我们处理值对象时,“自我验证”一词不涉及技术验证?
当不正确的借记卡号码甚至电子邮件地址有可能破坏业务规则时,该怎么办?
为了更清楚,请注意这个代表借记卡号的值对象:
public class DebitCardNumber : ValueObject
{
public string Number { get;private set; }
public CreditCardNumber(string number)
{
Validation(number);
this.Number = number;
}
private void Validation(string number)
{
if (String.IsNullOrWhiteSpace(number))
{
throw new CardNumberCanNotBeEmptyException();
}
if (number.Length != 16)
{
throw new CardNumberLengthMustBeSixteenDigitException();
}
int sum = 0;
for (int i = 1; i <= 16; i++)
{
if (!char.IsDigit(number[i - 1]))
{
throw new ValueContainsSomeNonDigitCharacterException();
}
int m = (i % 2 == 0 ? 1 : 2);
int a = (int.Parse(number[i - 1].ToString()) * m);
while (a > 9)
{
a -= 9;
}
sum += a;
}
if ((sum % 10) > 0)
{
throw new ValueIsNotCorrectAsACardNumberException()
{ Message = "Perhaps some digits has been entered in wrong order or they are incorrect." };
}
}
}
根据此代码,有一种验证方法可以执行算法来确定卡号的格式是否正确?您认为这是进行此类验证的正确位置吗?