我想知道采用验证的最佳方法是什么。
如果我有一个由其他自定义对象的基元,关联和集合组成的复杂对象对象,那么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,因此无法实现代码合同等(据我所知)。
答案 0 :(得分:2)
首先不要让你的对象进入无效状态,为你节省很多'IsValid'麻烦。
答案 1 :(得分:0)
由于您正在使用域驱动设计,我假设您已将类识别并建模为聚合。
回答你的问题:是的,聚合根负责确保自己和包含的所有内容在任何给定的时间点都有效。聚合根永远不应处于无效状态。
从评论中更新:摆脱验证界面。聚合应该永远不会处于无效状态。无论何时AR的状态即将发生变化,请确保结果状态不会制动任何不变量。如果愿意,AR应拒绝修改。
强制执行不变量,事后不要验证。