11
votes

Consumer desservices externes dans la conception axée sur le domaine

Je veux consommer des services Web tiers externes dans le projet de conception piloté de mon domaine, mais je ne suis pas en mesure de comprendre dans quelle couche je devrais accéder aux services Web externes. Dans les services de domaine, mais je ne le pense pas, car les services de domaine sont uniquement destinés aux objets de domaine. Mais mes exigences sont que, je dois effectuer une liste de fonctionnement en fonction de l'entrée de WebService externe, je dois effectuer une autre tâche dans le service de domaine. Je suis confus.


1 commentaires

Il existe de nombreuses façons de résoudre un problème et il y aura toujours des différences d'opinion. Peut-être devriez-vous ajouter plus de détails à votre question originale? Voulez-vous que l'accès accède aux données lorsqu'il a besoin ou que les données fournies par un autre déclencheur? Veuillez fournir plus de détails.


4 Réponses :


3
votes

De ce que je peux deviner, vous devez utiliser les services Web externes pour effectuer certaines opérations. Si vous voulez dire que vous voulez dire votre logique professionnelle, je pense que le bon endroit serait à la couche logique de votre entreprise. Dans votre contexte, vous devez simplement les utiliser. Où mettriez-vous un appel à une DLL externe qui calculille la TVA dans le cas où vous en avez besoin pour calculer un prix de produit?

J'espère que cela a du sens: -)


0 commentaires

9
votes

Ce que vous pouviez faire, introduit une interface avec le service requis en termes de modèle de domaine dans votre projet de domaine. Chaque fois qu'une classe de votre domaine a besoin du service, vous transmettez une référence à une implémentation de cette interface.

Ensuite, vous créez une "implémentation de connecteur" qui implémente cette interface et se connecte au Webservice que vous devez utiliser. Lorsque vous démarrez votre candidature, vous fournissez vos classes de domaine avec cette implémentation, par exemple à l'aide d'un cadre d'injection de dépendance.

Ce connecteur a une référence à votre modèle de domaine et à la définition du service Web. Votre modèle de domaine n'a aucune référence à la mise en œuvre du connecteur ni au WebService - il ne connaît que l'interface définie dans le projet de domaine. Ceci s'appelle inversion du contrôle.

De cette façon, vos classes de domaine ne savent rien sur le service Web, mais uniquement sur l'interface que vous avez définie dans votre modèle de domaine. Ainsi, votre logique de domaine reste séparé du monde extérieur «mal».


0 commentaires

4
votes

Je dirais qu'il y a quelques alternatives:

1) Comme indiqué précédemment, faites une interface qui représente une sorte de domaines-service et apporte une implémentation concrète qui appelle le service Web.

2) Si le service ne doit être appelé que lorsque quelque chose se passe, par exemple Lorsqu'une commande est confirmée, vous pouvez alors utiliser "Événements de domaine" (voir http://www.udidahan.com/2009/06/14/domain-events-salvation/ )

Laissez la méthode Ordre.Confirm () Méthode Soulevez un événement contrôlé et disposez d'un gestionnaire d'événements qui répond à l'événement et appelez le service Web de là. Le gestionnaire d'événements et la référence de service peuvent vivre dans la couche d'application qui consomme la couche de domaine.

3) Si le résultat du service Web peut être considéré comme un concept de domaine, vous pourrez peut-être créer une entité pour le résultat et un référentiel qui crée cette entité à partir du résultat WebService, caché ainsi le fait que ce sont des données externes .


2 commentaires

En fait, je souhaite créer un processeur de paiement pour mon application PayPal, Autherize.net. J'ai créé cela, il a également beaucoup d'entités telles que l'IPAYMENTMETHOD, PaymentInfo comme celles-ci. Mais je ne suis pas en mesure de conclure si je crée une agrégation distincte et mettez toutes ces entités là-bas et créez des services de domaine qui prendront des entités remplies de données et les transmettre à PayPal ou à Autherize.net et attendez le message d'état. Ce que je fais. La pièce de traitement du paiement est-elle interne à mon domaine ou non, je ne suis pas capable de conclure cela. S'il vous plaît aider.


IMO, quelle que soit la solution que vous choisissez est bien, tant que vos classes de domaine n'ont pas de dépendance sur PayPal et Authorize.net. Donc, il pourrait que le traitement du paiement fait partie de votre domaine: si oui, faites-le ainsi et choisissez des abstractions et des interfaces appropriées que vous pouvez réaliser avec les implémentations PayPal / Auth.Net. On dirait que vous êtes sur la bonne voie; Encore plus si vous obtenez les dépendances correctement.



7
votes

Vous avez besoin d'un nouveau service d'infrastructure pour accéder au service Web externe. Comme suggéré précédemment, vous auriez la mise en œuvre du service injectée dans votre objet de domaine.

Voir page 105 de "conception pilotée de domaine" par Eric Evans. Vous pouvez également consulter ma réponse ici pour comprendre les différents Types de services au sein de DDD.


6 commentaires

Vous me disiez de créer un service d'application et de l'injection dans l'objet de domaine. Est-ce possible ? Un objet de domaine peut-il accéder au service app. Comment ? D'autres me disent de faire dans le service de domaine. Total du désordre ici.


@ Vijay Dans mon domaine, j'ai l'annonceur et l'entité d'éditeur, je souhaite permettre à l'annonceur de déposer un fonds dans son équilibre qui fait partie de l'annonceur (Fonds de transfert de PayPal, sur un transfert réussi, nous augmentons son équilibre) pour le tirage et l'entité d'éditeur . Maintenant, pour soutenir Transfer PayPal nécessite divers paramètres, car j'ai créé diverses entités, qui sont remplies par exemple -: PaymentInfo et nous les transmettons à PayPal ou à toute passerelle de paiement. Alors où puis-je mettre toutes ces entités dans mon domaine? Dois-je créer un agrégat de paiement et créer un service de domaine pour le transfert ou dans l'application.


C'est très faux @chandra. Les dépendances vont de l'intérieur à l'extérieur, pas l'inverse. Le domaine ne peut jamais utiliser de services de candidature, mais les services d'application peuvent et doivent utiliser le domaine lorsqu'il s'agit de son exécution. En savoir plus sur l'achitecture propre par oncle Bob, il le rend vraiment clair. Une chose que vous pourriez faire est de lancer des événements de domaine à partir du domaine et des gestionnaires d'événements correspondants dans la couche d'application font leur truc.


On dirait que le service d'infrastructure ou le service de domaine basé sur votre autre réponse, ce n'est certainement pas un service d'application. Même cela écrit que les services externes des services Consumer Applaiton et non l'inverse ...


@ Inf3RNO: Merci de pointer cela! Je devais m'échapper pour Noël cette année-là (ou éventuellement saoul).


@Vijay Cette réponse n'est pas acceptée comme une réponse! Pourquoi ne puis-je pas injecter iHttpClient directement à mon service d'application? Pourquoi dois-je injecter iHttpclient à iExternalservice (dans ma couche d'infra sur le service), puis injecter iexternalservice dans mon service de demande? Et le lien que vous avez donné ne fournit pas de réponse à cette question spécifiquement!