2009-02-09 11 views
25

J'ai commencé à apprendre sur DDD et je voulais savoir comment les autres ont organisé leurs projets.Comment organiser un projet de conception piloté par domaine?

J'ai commencé en organisant autour de mes AggregateRoots:

MyApp.Domain (espace de noms pour le modèle de domaine)

MyApp.Domain.Product
- Produit
- IProductService
- IProductRepository
- etc

MyApp.Domain.Comment
- Commentaire
- ICommentService
- ICommentRepository
- etc

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository: IProductRepository
- etc

Le problème que j'ai rencontré avec ceci est que je dois référencer mon produit de domaine comme MyApp.Domain.Product.Product ou Product.Product. Je reçois également un conflit avec mon modèle de données linq pour le produit .... Je dois utiliser des lignes de code moche pour distinguer entre les deux tels que MyApp.Domain.Product.Product et MyApp.Respoitories.Product.

Je suis vraiment curieux de voir comment d'autres ont organisé leurs solutions pour DDD ...

J'utilise Visual Studio comme mon IDE.

Merci beaucoup.

Répondre

19

J'essaie de garder les choses très simples à chaque fois que je peux, si quelque chose comme cela fonctionne pour moi:

Myapp.Domain - Tous les domaines cours spécifiques partagent cet espace de noms

Myapp.Data - couche mince extrait la base de données du domaine.

Myapp.Application - Tous "code de soutien", l'exploitation forestière, le code partagé des services publics, les consommateurs de services, etc.

Myapp.Web - L'interface utilisateur Web

Ainsi, les classes seront par exemple:

  • Myapp.Domain.Sales.Order
  • Myapp.Domain.Sales.Customer
  • Myapp.Domain.Pricelist
  • Myapp.Data.OrderManager
  • Myapp.Data.CustomerManager
  • Myapp.Application.Utils
  • Myapp.Application.CacheTools

Etc

L'idée que j'essaie de garder à l'esprit que je vais est le long que l'espace de noms « domaine » est ce qui illustre la logique réelle de l'application. Donc ce qui se passe là est ce que vous pouvez parler aux "experts du domaine" (les mecs qui utiliseront l'application). Si je suis codage quelque chose à cause de quelque chose qu'ils ont dit, il devrait être dans l'espace de noms de domaine, et chaque fois que je code quelque chose qu'ils ne sont pas mentionnés (comme l'exploitation forestière, le suivi des erreurs, etc.), il ne devrait pas être dans l'espace de noms de domaine. Pour cette raison, je me méfie également de la création de hiérarchies d'objets trop complexes. Idéalement, un dessin quelque peu simplifié du modèle de domaine devrait être intuitivement compréhensible par les non-codeurs.

A cette fin, je ne commence pas normalement en pensant à des modèles dans plus de détails. J'essaie de modéliser le domaine aussi simple que je peux le faire, en suivant juste les directives de conception orientées objet standards. Qu'est-ce qui doit être un objet? Comment sont-ils liés? DDD dans mon esprit est sur la manipulation de logiciels complexes, mais si votre logiciel n'est pas très complexe au départ, vous pourriez facilement finir dans une situation où la façon de faire DDD ajoute de la complexité plutôt que de le supprimer.

Une fois que vous avez un certain niveau de complexité dans votre modèle, vous allez commencer à voir comment certaines choses doivent être organisées, et vous saurez quels sont les modèles à utiliser, quelles sont les classes d'agrégats, etc.

Dans mon exemple , Myapp.Domain.Sales.Order serait une racine globale dans le sens que lorsqu'il est instancié, il contiendra probablement d'autres objets, comme un objet client et collection de lignes de commande, et vous n'accéder aux lignes de commande pour ce particulier commander à travers l'objet de la commande. Cependant, pour simplifier les choses, je n'aurais pas d'objet "maître" qui ne contienne que le reste et qui n'a pas d'autre but, donc la classe de commande aura elle-même des valeurs et des propriétés utiles dans l'application.

Je vais donc faire référence à des choses comme:

Myapp.Domain.Sales.Order.TotalCost

Myapp.Domain.Sales.Order.OrderDate

Myapp.Domain.Sales.Order.Customer .PreferredInvoiceMethod

Myapp.Domain.Sales.Order.Customer.Address.Zip

etc.

+0

... est logique Ordre et client êtes-vous AggRoots droit? Donc quand vous référencez votre objet Order, vous devez le faire comme: Myapp.Domain.Sales.Order.Order ?? –

+0

Oui et non - J'ai un peu prolongé mon exemple, car la section des commentaires est un peu trop courte. – Console

+0

Les classes 'Manager' dans l'espace de noms' Data' me font chose du modèle anémique –

0

Votre domaine ont probablement un nom , vous devez donc utiliser ce nom comme espace de noms.

I référentiel mis usally mise en œuvre et accès aux données informations dans un espace de noms appelé dans le domaine Persistance espace de noms .

L'application utilise son propre nom comme espace de noms.

5

J'aime avoir le domaine dans l'espace de noms racine de l'application, dans sa propre assemblée: Cela représente parfaitement

le fait que le domaine est portée de tous:

Acme.Core.dll [Acme espace de noms racine] d'autres parties de l'application. (Pour en savoir plus, voir The Onion Architecture par Jeffrey Palermo).

Ensuite, j'ai un ensemble de données (généralement avec NHibernate) qui mappe les objets de domaine à la base de données. Cette couche met en œuvre du référentiel et des interfaces de service:

Acme.Data.dll [espace de noms racine: Acme.Data]

Ensuite, j'ai un ensemble de présentation déclarant éléments de mon interface utilisateur-modèle de choix:

Acme.Presentation.dll [espace de noms racine : Acme.Presentation]

Enfin, il y a le projet de l'interface utilisateur (en supposant une application web ici). C'est là la composition des éléments dans les couches précédentes se produit:

Acme.Web [espace de noms racine: Acme.Web]

0

Je vérifierais sur codecampserver depuis l'installation, il est assez fréquent.

Ils ont un projet de base dont ils comprennent à la fois l'application et les couches de domaine. C'est à dire. l'intérieur de l'oignon (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/). En fait, j'aime vraiment séparer le noyau en projets séparés pour contrôler la direction de la dépendance. Donc, en général je:

MyNamespace.SomethingWeb < - plusieurs UIs
MyNamespace.ExtranetWeb < - couche application Evans avec des classes comme CustomerService
MyNamespace.Domain - plusieurs UIs

MyNamespace.Application <

  • MyNamespace.Domain.Model < - entités
  • MyNamespace.Dom ain.Services < - Services Doman
  • MyNamespace.Domain.Repositories

MyNamespace.Infrastructure < - la mise en œuvre des prises en pension, etc.

MyNamespace.Common < - Un projet que tous les autres projets ont dépendance à laquelle a des choses comme un Logger, Util classes, etc

3

Bien que vous êtes également un développeur .Net, le Java implementation reference of the cargo app de DDD par Eric Evans et Citerus est une bonne ressource.

Dans le code doc'd, vous pouvez voir le DDD-organisation dans des contextes bornés et agrégats en action, droit dans les packages Java.En outre, vous pouvez considérer Sharp Architecture de Billy McCafferty. C'est une implémentation ASP.Net MVC, NHibernate/Fluent NHibernate qui est construite avec DDD à l'esprit.

Certes, vous devrez toujours appliquer une solution de dossier/espace de noms pour fournir les contextes. Mais, associez l'approche d'Evans aveC#Arch et vous devriez être sur votre chemin.

Dites-nous ce que vous allez faire. Je suis également sur le même chemin, et pas loin de vous!

codage heureux,

Kurt Johnson

+0

MISE À JOUR: Je devrais ajouter que la fourche Who-Can-Help-Me (WCHM) de Sharp Architecture. En septembre 2010, les mainteneurs du WCHM ont été inclus dans l'équipe des contributeurs pour Sharp. WCHM réorganise le projet Sharp Visual Studio en dossiers de solution qui se réfèrent explicitement aux concepts DDD. Il existe des dossiers pour les domaines (Infrastructure de domaine et domaine spécifique), la présentation (vues Web et contrôleurs Web), le framework (code considéré comme réutilisable sur plusieurs domaines et une couche de services (Tâches). . –

Questions connexes