J'essaye de construire un modèle de domaine avec des méthodes d'affaires et ai EF 4.1 faisant la persistance pour moi. Jusqu'ici tout va bien.Dans EF 4.1, puis-je avoir DBSet <ISomething> au lieu de DBSet <Something>?
Le problème est, toutes les propriétés sont exposées en tant que public sur mes classes de domaine. C'est au moins ce que j'ai appris du tutoriel de toute façon. Cela signifie que je n'ai aucune preuve solide que les propriétés de classe ne seront pas modifiées par certains programmeurs imprudents en dehors des méthodes commerciales. Encapsulation violée.
J'ai essayé d'introduire quelque chose mais TableAttribute ne s'applique qu'aux classes, pas aux interfaces, donc je ne peux pas dire à EF de faire DBSet. Si je laisse TableAttribute aux classes mais que je fais quelque chose implémenter quelque chose ISomething alors je ne peux pas faire DBSet.Add() car EF ne connait pas quelque chose. La seule façon que je peux penser est d'écrire une couche d'abstraction complète sur EF 4.1 pour CRUD en utilisant des interfaces. Sous le capot, faites la traduction de type entre quelque chose et quelque chose. Cela a semblé beaucoup de complexité et un trou béant dans le design d'EF. Ou j'ai dû manquer quelque chose.
Comment voulez-vous résoudre ce problème?
Merci beaucoup.
En fait, j'ai confondu deux questions un peu dans ma question, ma mauvaise. L'idée d'utiliser des interfaces est telle que j'ai une interface en lecture seule (seulement des getters) et une classe de lecture-écriture supportée par EF. Une fine couche au-dessus de EF médiatise les types. Mais la covariance de type se faufile rapidement lorsque l'on traite des objets dépendants et les choses deviennent très rapidement poilues. –
J'ai une logique de validation directement dans l'entité. En fait, mes méthodes d'affaires sont sur l'entité, par OO classique. Ainsi, Personne a Nom, Age, Humeur et CalculateMood(). Supposé que j'ai un adolescent, son humeur va être mauvaise. Si un programmeur imprudent change Age = 35 * après * CalculateMood() EF va mettre à jour avec diligence dans la base de données à age = 35 et mood = 'Bad'. C'est cette corruption que je veux empêcher. –
Et si vous faites allusion à une classe de méthode métier MoodHandler qui charge une personne, lit Person.Age puis définit Person.Mood = "Bad" alors les problèmes vont être 1) Le modèle de domaine est anémique (Fowler, 2003) et 2) cela n'empêche toujours pas le dit programmeur négligent de changer Person.Age = 35 après avoir placé Person.Mood = "Bad".Gardez à l'esprit que de nombreuses méthodes métier dans toutes les classes vont utiliser la même instance Person dans une transaction, de sorte que l'effet net est difficile à prévoir et à raisonner, et ne peut pas facilement être testé par unité. –