2011-07-27 2 views
1

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.

Répondre

1

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, je n'ont aucune preuve solide que les propriétés de classe ne changeront pas par certains programmeurs négligents en dehors des méthodes commerciales. L'encapsulation a été violée.

Comment cela va être résolu par l'interface? L'interface exposera à nouveau toutes les propriétés en tant que public et EF demande que la propriété doit avoir getter et setter.

EF n'est pas capable de fonctionner avec des interfaces. Lorsque vous utilisez EDMX pour le mappage, il est possible de jouer un petit peu avec l'accessibilité des propriétés, mais lorsque vous utilisez du code, c'est d'abord pire car le mappage est affecté par les mêmes règles d'accessibilité. Créer une couche d'abstraction au-dessus de EF est la même chose que de ne pas utiliser EF du tout. Une fois que vous avez créé l'abstraction, vous ne pouvez pas utiliser linq-to-entities directement et vous perdrez la raison principale pour utiliser EF.

Votre problème est plus sur: Où est la limite? Si vous voulez travailler avec des entités uniquement dans des méthodes métier, vous ne devez pas les exposer à ces méthodes. Si vous voulez vous assurer que les propriétés sont correctement traitées, vous devez peut-être implémenter une logique de validation directement dans l'entité.

+0

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. –

+0

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. –

+0

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é. –

Questions connexes