带导航属性的规范模式

时间:2017-03-18 01:02:33

标签: c# domain-driven-design specifications

规格模式与导航属性一起使用是否正确?

我有以下背景:

当我添加学生时,我需要验证地址。

学生班级:

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属性来验证每个地址。我不知道这是否正确。这将是一种横向验证。

1 个答案:

答案 0 :(得分:0)

在DDD中,验证是确保满足不变量的一种形式。这是聚合中聚合根的责任。在您的示例中,也许Student是Student Aggregate的根,StudentAddress作为子项。在这种情况下,学生有责任确保聚合处于有效状态。理想情况下,这个逻辑应该直接存在于Student类本身内部,但在您的情况下,您似乎使用StudentService来执行Student的验证。因此,在您的情况下,从StudentService执行地址验证将是正确的(IMO),因为它基本上承担了您的聚合根的责任。

您是否需要单独的StudentAddress验证器类型取决于相关验证规则的上下文/范围。例如,如果您必须验证地址包含城市,则可以在StudentAddress级别轻松完成。但是,如果您需要验证学生是否至少有一个地址,或者学生没有两个重复的地址,则需要在学生级别完成。

您可以了解有关DDD的更多信息here