web-dev-qa-db-fra.com

Domaine vs entités Modèle? Domaine-Driven-Design (DDD)?

Dans ce GitHub, https://github.com/johnph/simple-transaction , sous la Transaction.Framework Projet, il existe des entités (situées sur des données/entités)

  • Ré comptabilité.cs
  • CommentairesTransementity

et dans le dossier de domaine, il existe un modèle de domaine:

  • Réciblies.cs
  • AccountTransAction.cs
  • TransactionResult.cs

D'après ce que j'ai observé, les entités sont principalement utilisées pour les référentiels tandis que le modèle de domaine est utilisé pour presque tout le reste comme la validation de la logique professionnelle. Est-ce que cela est connu sous le nom de design de domaine?

7
Steve

C'est malheureusement une forme populaire de DDD. Je dis malheureusement parce qu'il ignore complètement les principes fondamentaux du DDD, c'est la modélisation réelle du problème.

Avoir des structures de données pures ne fait rien pour dire au lecteur ce qui se passe, quels problèmes sont résolus, il ne non Utilisez la langue omniprésente, car vous obtenez/définir Stuff est rarement si jamais fait partie du problème.

Si vous venez de simplement regardez la structure du référentiel Il semble que l'auteur soit allé à des longueurs évitez mentionnant quoi que ce soit pertinent pour le domaine à main. C'est exactement le contraire de ce qui devrait arriver. À chaque tour, vous devriez vous concentrer sur l'utilisation de la terminologie exacte que vous utilisez vos pairs professionnels.

8
Robert Bräutigam

Je vois cela comme une séparation stricte entre le modèle de domaine et le modèle de persistance. En dupliquant ce modèle, il devient possible de supprimer des modèles pour leur objectif spécifique. On représente des règles commerciales, d'autres sont faciles à persister et à interroger. Si ce n'était juste un modèle unique, il serait nécessaire de faire du commerce entre les deux.

Ceci est un moyen spécifique de mettre en œuvre DDD. Dans le DDD uni, rien ne parle de la manière dont les entités de domaine doivent être persistées. Il est considéré comme une préoccupation secondaire. Dans DDD, vous ne penseriez que les entités de domaine et la manière dont ces entités sont persistées est décidée ailleurs.

Mais dans le cas de cette mise en œuvre spécifique, je trouve qu'il y a une chose incorrecte. Dans DDD, les référentiels font partie du modèle de domaine lui-même. Cela signifie que le référentiel devrait fonctionner avec des entités de domaine, pas des entités de persistance. Mais c'est ce qui se passe ici. La transformation du domaine vers des entités de persistance se produit dans les services, ce qui est un mauvais endroit pour le faire. Cela devrait arriver à l'intérieur des référentiels. De cette façon, cela devient la mise en œuvre des détails d'un référentiel. De cette façon, il est sans rapport avec l'utilisateur du référentiel si le référentiel utilise EF, SQL uni ou quelque chose de différent pour persister les données.

Exemple de ce qui précède est dans /src/frameworks/transaction/services/transactions/transactions.cs dans la méthode CreateTransactionAndUpdateSummary (utilisant Automapper ):

// transform domain entity to persistence entity  
var accountTransactionEntity = _mapper.Map<AccountTransactionEntity>(accountTransaction);
var accountSummaryEntity = _mapper.Map<AccountSummaryEntity>(accountSummary);

// call repository with persistence entities
await _accountTransactionRepository.Create(accountTransactionEntity, accountSummaryEntity);
var currentSummary = await _accountSummaryRepository.Read(accountTransaction.AccountNumber);

// transform persistence entity to domain entity
var result = _mapper.Map<TransactionResult>(accountTransactionEntity);

Le code ci-dessus devrait être à l'intérieur du référentiel lui-même, pas dans le service.

4
Euphoric