嵌套验证

时间:2012-09-07 10:17:13

标签: c# validation domain-driven-design

我想知道采用验证的最佳方法是什么。

如果我有一个由其他自定义对象的基元,关联和集合组成的复杂对象对象,那么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,因此无法实现代码合同等(据我所知)。

2 个答案:

答案 0 :(得分:2)

首先不要让你的对象进入无效状态,为你节省很多'IsValid'麻烦。

答案 1 :(得分:0)

由于您正在使用域驱动设计,我假设您已将类识别并建模为聚合

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

从评论中更新:摆脱验证界面。聚合应该永远不会处于无效状态。无论何时AR的状态即将发生变化,请确保结果状态不会制动任何不变量。如果愿意,AR应拒绝修改。

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