0

我想知道最好的验证方法是什么。

如果我有一个由基元、关联和其他自定义对象的集合组成的复杂对象对象,是否应该使用 IsValid() 方法验证子对象以及根对象的所需字段/键?

如果是,这应该在某种抽象类中,还是最好使用接口?对于抽象,我需要将我的子对象接口转换为它们的具体类定义才能使用抽象方法,而对于接口验证,我相信我可以让我的子对象作为接口,因为我称之为他们的验证方法。

另外,我没有使用 MVC,而是使用 Web 表单的 MVP(并尝试使用 DDD 原则)。

谢谢。

更新

我有一个 ScheduledMeeting 的聚合根:

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

回答您的问题:是的,聚合根负责确保其自身和所包含的所有内容在任何给定时间点都是有效的。聚合根永远不应处于无效状态。

评论更新:摆脱您的验证界面。聚合从一开始就不应该处于无效状态。每当您的 AR 状态即将改变时,请确保生成的状态不会破坏任何不变量。如果可以,AR 应该拒绝修改。

强制执行不变量,不要在事后验证。

于 2012-09-07T10:22:45.697 回答