0

検証を行う最善のアプローチは何なのか疑問に思っています。

他のカスタム オブジェクトのプリミティブ、関連付け、およびコレクションで構成された複雑なオブジェクト オブジェクトがある場合、IsValid() メソッドは子オブジェクトとルート オブジェクトの必須フィールド/キーを検証する必要がありますか?

はいの場合、これはある種の抽象クラスにする必要がありますか、それともインターフェイスを使用するのが最善ですか? 抽象では、抽象メソッドを使用するために子オブジェクト インターフェイスを具象クラス定義にキャストする必要がありますが、インターフェイス検証では、検証メソッドを呼び出すときに子をインターフェイスとして保持できると考えています。

また、私は MVC を使用していませんが、Web フォームで MVP を使用しています (そして DDD の原則を採用しようとしています)。

ありがとう。

アップデート

ScheduledMeeting の Aggregate ルートがあります。

class ScheduledMeeting : BaseValidation
{
     ScheduledMeetingID {get;set;}
     ITimeSlot TimeSlot {get;set;}
     IList<IMeetingAssignee> Assignees{get;set;}
     DateTime meetingDate {get;set;}

     AssignEmployees(IList<IEmployees> employees){}
}

現在、次のような BaseValidation の抽象クラスが存在します。

 public bool isValid(bool validateKeys)
    {
        if (validateKeys)
        {
            ValidateRequiredFields();
            ValidateKeys();
        }
        else
        {
            ValidateRequiredFields();
        }
        return true;
    }  

ValidateRequiredFields() と ValidateKeys() は、オブジェクトの実装でオーバーライドされます。

上記を使用して IMeetingAssigned にカスケードする場合は、ScheduledMeeting で ValidateKeys() と ValidateRequiredKeys() の両方をループし、IMeetingAssigned を具体的な MeetingAssigned にキャストしてから、このオブジェクトで ValidateKeys() または ValidateRequiredKeys() を呼び出す必要があります ( BaseValidation も実装するため) など、ずっと下まで続きます。

更新 2

私は .NET 3.5 で立ち往生しているため、コード コントラクトなどを実装できません (私の知る限り)。

4

2 に答える 2

2

そもそもオブジェクトを無効な状態にしないでください。これにより、「IsValid」の問題が大幅に軽減されます。

于 2012-09-07T11:02:29.103 に答える
0

ドメイン駆動設計を採用しているため、クラスをAggregatesとして識別およびモデル化していると思います。

あなたの質問に答えるには: はい、Aggregate Rootは、それ自体とそこに含まれるすべてのものが特定の時点で有効であることを確認する責任があります。Aggregate Root が無効な状態であってはなりません。

コメントからの更新:検証インターフェースを取り除きます。そもそも Aggregate が無効な状態であってはなりません。AR の状態が変化しようとしているときはいつでも、結果の状態が不変条件を壊さないことを確認してください。その場合、AR は変更を拒否する必要があります。

不変条件を強制し、事後に検証しないでください。

于 2012-09-07T10:22:45.697 に答える