2017-03-18 3 views
0

Est-il correct d'utiliser Modèle de spécification avec les propriétés de navigation?Modèle de spécification avec propriétés de navigation

J'ai le contexte de suivi:

Quand j'ajoute un étudiant, je dois valider les adresses.

Student Classe:

public class Student { 
    public string Name { get; set; } 
    public DateTime Birth { get; set; } 
    //... 
    public virtual ICollection<StudentAddress> StudentAdresses { get; set; } 
} 

StudentAddress Classe:

public class StudentAdress{ 
    public int Id { get; set;} 
    public string Street { get; set; } 
    //... 
} 

Sur mon service étudiant (DDD):

Service:

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: validation étudiant dispose d'un ensemble de spécifications qui peupleront un objet résultat de validation et que je vais le récupérer par la notification du contrôleur de domaine (MVC)

Retour à la question ...

Où puis-je mettre mes spécifications de classe d'adresses d'étudiant?

J'ai pensé à la possibilité de les placer dans la classe StudentValidation et d'utiliser la propriété Navigation pour pouvoir valider chaque adresse. Je ne sais pas si c'est correct. Ce serait un type de validation transversale.

+0

Pourquoi StudentAddress est-il une entité? Ce devrait être un objet de valeur. –

+0

Je pense que ma réponse à cette question peut vous guider dans la bonne direction en ce qui concerne les validations de l'interface utilisateur vs domaines: http://stackoverflow.com/questions/28395176/should-i-abstract-the-validation-framework-from-domain- couche/28397201 # 28397201 – plalx

+0

Constantin, StudentAddress est une table sur ma base de données. Il a une identité et je pense que les objets de valeur sont un ensemble de propriétés d'une entité spécifique. –

Répondre

0

En DDD, la validation est une forme de vérification de la conformité des invariants. C'est la responsabilité de la racine agrégée dans un agrégat. Dans votre exemple, peut-être que Student est la racine de Student Aggregate, avec StudentAddress en tant qu'enfant. Dans ce cas, il est logique que l'étudiant soit responsable de s'assurer que l'agrégat est dans un état valide. Idéalement, la logique pour cela devrait littéralement vivre à l'intérieur de la classe Student elle-même, mais dans votre cas, vous semblez utiliser un StudentService pour effectuer la validation de Student. Donc, dans votre cas, il serait bon (IMO) d'effectuer la validation d'adresse à partir de StudentService, car il prend essentiellement la responsabilité de votre racine agrégée.

Que vous ayez besoin de types de validateurs distincts pour StudentAddress ou non pour Student, cela dépend du contexte/de la portée de la règle de validation en question. Par exemple, si vous devez valider qu'une adresse inclut une ville, cela se fait facilement au niveau StudentAddress. Cependant, si vous devez valider qu'un étudiant a au moins une adresse, ou qu'un étudiant n'a pas deux adresses en double, cela devrait être fait au niveau de l'étudiant.

Vous pouvez en apprendre plus sur DDD en général here.