DDD avec EF Premier Code comment faire pour les mettre ensemble?
Je suis en train d'apprendre DDD développement pour quelques jours, et je commence à l'aimer.
J'ai (je pense) comprendre le principe de la DDD, où votre objectif principal est sur business objects, où vous avez des agrégats, les agrégats, les racines, les référentiels juste pour les agrégats racines et ainsi de suite.
Je suis en train de créer un projet simple où je combine DDD développement avec une Première approche de Code.
Mes questions sont: (je suis en utilisant asp.net MVC)
- DDD Business Objects sera différent de celui du Premier Code d'objets?
Même s'ils seront probablement les mêmes, par exemple je peux avoir unProduct
objet de l'entreprise qui dispose de toutes les règles et les méthodes, et je peux avoir unProduct
le premier code (POCO) de l'objet qui ne contiennent que les propriétés j'ai besoin de sauvegarder dans la base de données. - Si la réponse à la question 1 est "vrai", alors comment dois-je aviser le
Product
POCO objet d'une propriété de l'objet métierProduct
a été changé et je dois le mettre à jour? Je suis en utilisant un "AutoMapper" ou quelque chose comme cela?
Si la réponse est "non", je suis complètement perdu.
Pouvez-vous me montrer le plus simple (CRUD) exemple de comment puis-je mettre les deux ensemble?
Merci
cette question peut vous donner des idées supplémentaires :stackoverflow.com/questions/8556365/...
OriginalL'auteur Catalin | 2012-11-04
Vous devez vous connecter pour publier un commentaire.
La réponse est Non. Une des meilleures choses à propos de EF code-la première est qu'il s'intègre parfaitement avec DDD, puisque vous avez à créer votre business objects par la main afin de ne pas utiliser votre EF modèles équivalent à DDD entités et des objets de valeur. Pas besoin d'ajouter une couche supplémentaire de complexité, je ne pense pas que DDD recommande de n'importe où.
Vous pourriez même avoir votre entités à mettre en œuvre un IEntity et vous des objets de valeur à mettre en œuvre IValue, en plus de suivre le reste de DDD modèles à savoir les Référentiels de faire de la communication réelle à la base de données. Plusieurs de ces idées, vous pouvez trouver ce très bon exemple d'application .NET, même si elle n'utilise pas les EF premier code, il est toujours très précieux: http://code.google.com/p/ndddsample/
vous pouvez avoir tous les trucs que vous avez mentionné, et vous pouvez les ignorer dans la cartographie ou les associer à différents noms de colonne, etc... la cartographie fait partie d'un IRepository la mise en œuvre et devient un détail d'implémentation qui ne pollue pas votre modèle. Dans tous les cas, un bon design est à propos de la gestion de la complexité, donc même si vous n'êtes pas suivant DDD à la lettre, il est encore mieux avec de la gestion d'une entreprise calque de l'objet. Le seul moment où vous pourriez avoir besoin d'une telle cartographie si vous aviez un héritage de la base de données que vous êtes d'accrochage et veulent avoir un propre modèle, puis de l'associer à un autre modèle qui correspond à votre db
+1 d'accord sur le premier paragraphe, mais dans le contexte de DDD, je suis également d'accord avec l'OP que EF entités ne peuvent pas être traiter comme modèle de domaine parce que je viens de réaliser EF ne prend pas en charge le mappage d'un db tableau à plusieurs entités. Modèle de domaine nécessitent d'être créé/mappé manuellement (à l'aide de AutoMapper/ValueInjecter). Ce sont à faire dans les affaires de l'objet. C'gain cadre de complexité, mais je pense que réduire le développement des affaires.
Les informations ci-dessus n'est pas correct concernant des objets de valeur. Des objets de valeur n'ont pas d'Id par définition et cadre de l'entité (et de bases de données relationnelles en général) ne prennent pas en charge cette.
EF6 prend en charge les Objets de Valeur/ComplexTypes
OriginalL'auteur
Mise à jour je n'ai plus de plaider pour l'utilisation des "objets de domaine" et au lieu de préconiser une utilisation d'une messagerie à base de modèle de domaine. Voir ici pour un exemple.
La réponse à la n ° 1 est ça dépend. Dans toute application d'entreprise, vous allez trouver 2 grandes catégories de choses dans le domaine:
Droite CRUD
Il y a pas besoin d'un objet de domaine ici parce que le prochain état de l'objet ne dépend pas de l'état antérieur de l'objet. C'est l'ensemble des données et pas de comportement. Dans ce cas, c'est ok pour utiliser la même classe (c'est à dire un EF POCO) partout: de l'édition, de la persistance, de l'affichage.
Un exemple de ceci est l'enregistrement d'une adresse de facturation sur une commande:
D'autre part, nous avons...
Machines D'État
Vous avez besoin d'avoir objets séparés pour le domaine du comportement et de la persistance de l'état (et un référentiel de faire le travail). L'interface publique sur le domaine de l'objet devrait presque toujours être toutes les méthodes void et pas de public getters. Un exemple de ceci serait de statut de la commande:
La réponse à la n ° 2 est que la DbContext va automatiquement suivre les modifications apportées à EF classes.
OriginalL'auteur
Récemment j'ai fait un projet similaire. J'ai suivi ce tutoriel: lien
Et j'ai fait de cette manière: j'ai créé la solution Vide, ajouté projets: Domaine, le Service et l'interface utilisateur web.
Tout simplement déclaré dans le domaine j'ai mis le modèle (par exemple les classes pour EF premier code, méthodes, etc.)
Le Service a été utilisé pour le domaine de communiquer avec le monde (WebUI, MobileUI, d'autres sites, etc.) à l'aide de asp.net webapi
WebUi a été fait application MVC (mais le modèle était dans le domaine c'est donc surtout VC)
Espère que j'ai aidé
OriginalL'auteur
Pluralsight cours: Entity Framework dans l'Entreprise va dans ce scénario exact de Domain Driven Design incorporated avec les objectifs EF Premier Code.
Pour le numéro 1, je crois que vous pouvez le faire de toute façon. C'est juste une question de style.
Pour le numéro 2, l'instructeur dans la vidéo passe par un couple de façons de rendre compte de cela. Une façon est d'avoir un "État" de la propriété sur à chaque classe qui est situé sur le côté client lors de la modification d'une valeur. Le DbContext sait alors quels sont les changements à persister.
cette Pluralsight cours est un peu brouillon, Julie va vous apprendre comment utiliser générique référentiel antipattern et la façon de construire un grand nombre d'abstractions inutiles pour rendre votre code plus compliqué
hey, j'ai appris beaucoup de choses dans les 2 dernières années et je ne suis plus un fan du générique de repos, sauf pour le plus simple CRUD scénarios! Je vais être mise à jour par EF cours d'Entreprise avec le DDD trucs que j'ai appris depuis que j'ai construit que le précédent. sûr. Plus EF prend désormais en charge les moqueries beaucoup plus en douceur ergo moins d'abstraction. Espérons que vous serez plus friands de l'udpate, ILICH. 🙂
OriginalL'auteur
La fin de question sur ce sujet.
La lecture de Josh Kodroff réponse confirme mes pensées au sujet de la mise en œuvre d'un Référentiel, par exemple, Entity Framework DAL.
Vous carte le domaine de l'objet à une EF de la persistance de l'objet et de laisser EF manipuler lors de l'enregistrement.
Lors de la récupération, vous laissez EF extraire de la base de données et de l'associer à votre domaine d'objet(l'ensemble de la racine) et l'ajoute à votre collection.
Est-ce la bonne stratégie pour le référentiel de mise en œuvre?
Cette réponse est plus approprié comme un commentaire ou une question distincte.
Oui. Désolé, mais je viens de m'inscrire et de ne pas avoir 50 rep-points me permettre de commenter sur Josh réponse. Merci pour vos commentaires bien et merci Hippoom, mes pensées exactement.
OriginalL'auteur