将规格模式与导航属性一起使用是否正确?
我有以下背景:
当我添加学生时,我需要验证地址。
学生班级:
public class Student {
public string Name { get; set; }
public DateTime Birth { get; set; }
//...
public virtual ICollection<StudentAddress> StudentAdresses { get; set; }
}
StudentAddress 类:
public class StudentAdress{
public int Id { get; set;}
public string Street { get; set; }
//...
}
在我的学生服务(DDD)上:
服务:
public void AddStudent(Student student)
{
// code
var studentValidation = new StudentValidation().Validate(student); // Student Validation has a set of specifications that will populate a validation result object and that I'll retrieve it by Domain Controller Notification (MVC)
// code
}
PS:学生验证有一组规范,用于填充验证结果对象,我将通过域控制器通知(MVC)检索它
回到问题......
我可以在哪里提出学生地址类规范?
我想到了将它们放在StudentValidation类中的可能性,并使用Navigation属性来验证每个地址。我不知道这是否正确。这将是一种横向验证。
答案 0 :(得分:0)
在DDD中,验证是确保满足不变量的一种形式。这是聚合中聚合根的责任。在您的示例中,也许Student是Student Aggregate的根,StudentAddress作为子项。在这种情况下,学生有责任确保聚合处于有效状态。理想情况下,这个逻辑应该直接存在于Student类本身内部,但在您的情况下,您似乎使用StudentService来执行Student的验证。因此,在您的情况下,从StudentService执行地址验证将是正确的(IMO),因为它基本上承担了您的聚合根的责任。
您是否需要单独的StudentAddress验证器类型取决于相关验证规则的上下文/范围。例如,如果您必须验证地址包含城市,则可以在StudentAddress级别轻松完成。但是,如果您需要验证学生是否至少有一个地址,或者学生没有两个重复的地址,则需要在学生级别完成。
您可以了解有关DDD的更多信息here。