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." };
}
}
}
このコードによると、アルゴリズムを実行してカード番号の形式が正しいかどうかを確認する Validation メソッドがあります。このタイプの検証に適した場所だと思いますか?