Comment Organiser un Domain Driven Design Projet?
J'ai commencé l'apprentissage de DDD et je voulais savoir comment d'autres ont organisé leurs projets.
J'ai commencé par organiser autour de mon AggregateRoots:
MyApp.Domaine (espace de noms pour le domaine modèle)
MyApp.Domaine.Produit
- Produit
- IProductService
- IProductRepository
- etc
MyApp.Domaine.Commentaire
- Commentaire
- ICommentService
- ICommentRepository
- etc
MyApp.L'Infrastructure
- ...
MyApp.Référentiels
- ProductRepository : IProductRepository
- etc
Le problème que j'ai rencontré en est que je référence mon domaine produit MyApp.Domaine.Produit.Produit ou d'un Produit.Produit. Je reçois aussi un conflit avec mon linq modèle de données pour les produits....J'ai utiliser laide de lignes de code pour distiguish entre les deux comme MyApp.Domaine.Produit.Produit et MyApp.Respoitories.Produit.
Je suis vraiment intéressé de voir comment d'autres ont organisé leurs solutions pour DDD...
Je suis à l'aide de Visual Studio que mon IDE.
Merci beaucoup.
Vous devez vous connecter pour publier un commentaire.
J'essaie de garder les choses très simple, dès que je peux, donc généralement quelque chose comme cela fonctionne pour moi:
Myapp.Domaine - domaine spécifique des classes de partager cet espace de noms
Myapp.Données sur couche Mince qui fait abstraction de la base de données du domaine.
Myapp.Mise en Application - Tous "code de prise en charge", l'exploitation forestière, partagé code d'utilitaire, le service consommateurs ...
Myapp.Web L'INTERFACE web
Donc les classes seront par exemple:
Etc.
L'idée, j'essaie de garder à l'esprit au fur et à mesure, c'est que le "domaine" de l'espace de noms est ce qui rend la logique réelle de l'application. Donc ce qui se passe, il est ce que vous pouvez parler à la "les experts du domaine" (Le gars qui va être à l'aide de l'application) environ.
Si je suis codage quelque chose à cause de quelque chose qu'ils ont mentionné, il devrait être dans l'espace de noms de domaine, et chaque fois que je code quelque chose qu'ils n'ont pas mentionné (comme l'exploitation forestière, le traçage des erreurs, etc), il ne devrait PAS être dans l'espace de noms de domaine.
À cause de cela, je suis aussi méfiant à propos de la faire trop compliqué objet hiérarchies. Idéalement un peu simplifié le dessin du modèle de domaine doit être intuitivement compréhensible par des non-programmeurs.
À cette fin, je ne suis pas normalement commencer par la réflexion sur les modèles en détail. J'essaie de modéliser le domaine aussi simple que je le peut, à la suite que la norme de conception orientée objet des lignes directrices. Ce qui doit être un objet? Comment sont-ils liés?
DDD dans mon esprit, c'est la manipulation d'un logiciel complexe, mais si votre logiciel n'est pas lui-même très complexe pour commencer, vous pourrait facilement se retrouver dans une situation où le DDD façon de faire les choses ajoute de la complexité plutôt que de le supprimer.
Une fois que vous avez un certain niveau de complexité de votre modèle, vous allez commencer à voir comment certaines choses devraient être organisées, et vous saurez alors quels sont les modes d'utilisation, les classes sont des agrégats etc.
Dans mon exemple, Myapp.Domaine.De vente.L'ordre serait une racine d'agrégat dans le sens que quand elle est instanciée, il sera susceptible de contenir d'autres objets, comme un client de l'objet et de la collecte de lignes de commande, et vous n'aurez que l'accès aux lignes de commande pour la commande par le biais de l'objet de commande.
Cependant, afin de garder les choses simples, je n'aurais pas un "maître" de l'objet qui ne contient que tout le reste et n'a pas d'autres fins, de sorte que la classe elle-même ont des valeurs et des propriétés qui sont utiles dans l'application.
J'ai donc fait référence à des choses comme:
Myapp.Domaine.De vente.Ordre.Prixtotal
Myapp.Domaine.De vente.Ordre.Date de commande
Myapp.Domaine.De vente.Ordre.Client.PreferredInvoiceMethod
Myapp.Domain.Sales.Order.Customer.Address.Zip
etc.
Manager
classes dansData
espace de noms me faire chose de anémique modèleJ'aime avoir le domaine dans l'espace de noms racine de l'application, dans sa propre assemblée:
Acme.Core.dll
[espace de noms racine:Acme
]Cette manière ordonnée représente le fait que le domaine est à la portée de toutes les autres parties de l'application. (Pour en savoir plus, consultez L'Oignon De L'Architecture par Jeffrey Palerme).
Prochaine, j'ai une assemblée de données (généralement avec NHibernate) qui mappe le domaine des objets de la base de données. Cette couche implémente référentiel et des interfaces de service:
Acme.Data.dll
[espace de noms racine:Acme.Data
]Puis, j'ai une présentation à l'assemblée de déclarer les éléments de mon UI-motif de choix:
Acme.Presentation.dll
[espace de noms racine:Acme.Presentation
]Enfin, il est l'INTERFACE utilisateur du projet (en supposant une application web ici). C'est là que la composition des éléments dans les précédents couches a lieu:
Acme.Web
[espace de noms racine:Acme.Web
]Bien que vous soyez aussi .Net développeur, le L'implémentation Java de référence de la cargaison app de DDD par Eric Evans et Citerus est une bonne ressource.
Dans la doc avais le code, vous pouvez voir le DDD-organisation en délimitée contextes et des agrégats dans l'action, droit dans les packages Java.
En outre, vous pourriez envisager de Billy McCafferty de Forte De L'Architecture. C'est un ASP.Net MVC, NHibernate/NHibernate Fluent mise en œuvre qui se construit avec DDD à l'esprit.
Certes, vous aurez toujours besoin d'appliquer un dossier/espace de noms de la solution pour fournir les contextes. Mais, en couple Evans approche avec #Arc et vous devriez être bien sur votre façon.
Laissez-nous savoir ce que vous allez avec. Je suis sur le même chemin, et pas loin de vous!
Heureux de codage,
Kurt Johnson
Votre domaine ont probablement un
nom, donc vous devez utiliser cette
nom d'espace de noms.
Je usally mettre référentiel
la mise en œuvre et d'accès aux données
les détails dans un espace de noms appelé
La Persistance dans le cadre du domaine
espace de noms.
L'application de l'utilisation de son propre nom
comme l'espace de noms.
J'avais découvrez codecampserver depuis l'installation il est tout à fait commun.
Ils ont un projet de base dans lequel ils comprennent à la fois l'application et le domaine des couches. I. e. l'intérieur de l'oignon (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/).
En fait, j'aime à briser le noyau à l'écart, dans des projets séparés pour contrôler la direction de la dépendance. Donc généralement j'ai:
MyNamespace.SomethingWeb <-- plusieurs Isu
MyNamespace.ExtranetWeb <-- plusieurs Isu
MyNamespace.Application <-- Evans' application de la couche avec des classes comme CustomerService
MyNamespace.Domaine
MyNamespace.Infrastructure <-- des pensions de mise en œuvre, etc.
MyNamespace.Commune <-- Un projet dont tous les autres projets ont une dépendance à qui a les choses comme un Enregistreur, Util classes, etc.