Les services devraient-il toujours revenir Otd, ou peuvent-ils aussi le retour des modèles de domaine?
Je suis (re)conception de l'application à grande échelle, nous utilisons multi-couche de l'architecture, basé sur DDD.
Nous avons MVC avec couche de données (mise en œuvre de référentiels), domaine de la couche (définition de modèle de domaine et des interfaces - référentiels, des services, de l'unité de travail), de la couche de service (mise en œuvre de services). Jusqu'à présent, nous utilisons des modèles de domaine (pour la plupart des entités) à travers toutes les couches, et nous utilisons des Otd seulement que les modèles de vue (dans le contrôleur, le service renvoie au modèle du domaine(s) et le contrôleur crée la vue du modèle, qui est passé à la vue).
J'ai réussit à lire de nombreux articles sur l'utilisation, ne pas utiliser, de la cartographie et de passage Otd. Je comprends qu'il n'y a pas de réponse définitive, mais je ne suis pas sûr si c'est ok ou pas retourner au domaine des modèles de services aux contrôleurs. Si je retourne modèle de domaine, il est encore jamais passé à la vue, puisque le contrôleur crée toujours de la vue spécifique du modèle de vue - dans ce cas, il semble légitime. D'autre part, il ne se sent pas à droite lorsque le modèle de domaine feuilles d'affaires de la couche (couche de service). Parfois, les besoins en services pour renvoyer des données de l'objet qui n'était pas définie dans le domaine, puis nous soit nécessaire d'ajouter de nouveaux objets pour le domaine qui n'est pas mappé, ou créer POCO objet (ce qui est laid, car certains services de retourner les modèles de domaine, certains efficacement retour Otd).
La question est de savoir si nous avons strictement l'utilisation des modèles de vue, est-il ok pour revenir domaine de modèles de tous les contrôleurs, ou faut-il toujours utiliser les Dto pour la communication avec la couche de service? Si oui, est-il ok pour ajuster les modèles de domaine basé sur ce que les services de besoin? (Franchement, je ne pense pas, étant donné que les services devraient consommer ce domaine est.) Si l'on doit strictement Otd, devraient-ils être définis dans la couche de service? (Je crois.) Parfois, il est clair que nous devrions utiliser les Dto (par exemple, lorsque le service effectue beaucoup de la logique d'entreprise et crée de nouveaux objets), parfois il est clair que nous devrions utiliser seulement les modèles de domaine (par exemple, lorsque l'Appartenance à des retours de service anémique Utilisateur(s) - il semble qu'il ne serait pas beaucoup de sens pour créer des DTO qui est le même que le modèle de domaine), mais je préfère la cohérence et les bonnes pratiques.
Article Domaine vs DTO vs ViewModel - Comment et Quand les utiliser? (et aussi quelques autres articles) est très similaire à mon problème, mais il n'a pas répondu à cette question(s). Article Dois-je mettre en œuvre des Otd dans un modèle de référentiel avec EF? est également similaire, mais il n'a pas affaire à DDD.
Avertissement: je n'ai pas l'intention d'utiliser le design pattern seulement parce qu'il existe et qu'il est fantaisie, d'autre part, je tiens à utiliser des modèles et des pratiques aussi parce qu'il contribue à la conception de l'ensemble de la demande, aide à la séparation des préoccupations, de même tohugh l'aide d'un modèle particulier n'est pas "nécessaire", au moins pour le moment.
Comme toujours, je vous remercie.
- Pour les gars qui vote pour le proche - s'il vous plaît pourriez-vous expliquer pourquoi voulez-vous fermer cette question d'opinion sur la base?
- Parce que c'EST l'avis de la base. Bonne architecture peut-être due à un consensus, mais il est encore l'opinion. Ce n'est pas un bon ajustement pour le Q&Un format de soi, car elle tend à susciter un débat. Essayez CodeReview.
- L'examen est une question et une réponse du site de partage de code du projet sur lequel vous travaillez pour l'examen par les pairs." - ma question n'est pas du tout sur le code, de sorte qu'il serait hors sujet là;: "Focus sur les questions à propos d'un problème réel que vous avez rencontrés. D'inclure des détails sur ce que vous avez essayé et exactement ce que vous essayez de faire." - Je suis expert problème, j'ai essayé de résoudre. Pourriez-vous être plus précis, quel est le problème avec cette question, car beaucoup de questions sont sur l'architecture et de telles questions sont apparemment ok, donc je peux éviter de nouveaux malentendus?
- Je vous remercie de poser cette question. Vous avez fait une faveur pour moi, et m'a rendu la vie beaucoup plus simple et heureux, je vous remercie.
- ne me dérange pas SI Proche de la Mafia, votre question est légitime.
- Grand merci pour cette question
- Un bon beaucoup de questions sont opinion fondée, par définition, et qui n'est pas diminuer la valeur de la question et la réponse. En particulier, toute question qui se rapporte à des modèles de conception.
Vous devez vous connecter pour publier un commentaire.
Vous fait vous sentir comme vous êtes en tirant les tripes à droite? Selon Martin Fowler: la Couche de Service définit l'application de la frontière, il encapsule le domaine. En d'autres termes, il protège le domaine.
Pouvez-vous fournir un exemple de cet objet de données?
Oui, parce que la réponse est la partie de votre couche de service. Si elle est définie "somewhere else", puis la couche de service doit faire référence "qu'ailleurs", ajouter une nouvelle couche à tes lasagnes.
Un DTO est une demande/réponse de l'objet, c'est logique, si vous l'utilisez pour la communication. Si vous utilisez les modèles de domaine dans la couche de présentation (MVC-Contrôleurs/Vue, WebForms, ConsoleApp), puis la couche de présentation est étroitement associé à votre domaine, tout changement dans le domaine vous oblige à changer vos contrôleurs.
C'est un des désavantages de DTO à nouveau les yeux. Maintenant, vous pensez la duplication de code, mais que votre projet se développe alors il faudrait faire beaucoup plus de sens, spécialement dans un environnement d'équipe où les différentes équipes sont réparties dans les différentes couches.
DTO peut ajouter de la complexité supplémentaire à votre demande, mais il en est de vos couches. DTO cher la fonctionnalité de votre système, qu'ils ne viennent pas gratuitement.
Pourquoi utiliser un DTO
Cet article fournit à la fois l'avantage et l'inconvénient de l'utilisation d'un DTO, http://guntherpopp.blogspot.com/2010/09/to-dto-or-not-to-dto.html
Résumé comme suit:
Quand Utiliser
Quand ne pas Utiliser
Arguments Contre DTO
Arguments Avec DTO
s. You domain changes because of new features. Your features change the DTO
s votre DTO du changement de vos contrôleurs, etc, de la recompilation et tout et tout. C'est une hypothèse erronée que vous faites.Dans mon expérience, vous devez faire ce qui est pratique. "Le meilleur modèle est le dessin le plus simple qui fonctionne" - Einstein. Avec cela à l'esprit...
Absolument c'est ok! Si vous avez de Domaine Entités, DTO et Afficher les Modèles y compris les tables de base de données que vous avez tous les champs de l'application répétée dans 4 lieux. J'ai travaillé sur de grands projets où Domaine Entités et les Modèles de Vue a très bien fonctionné. La seule expception de ceci est que si l'application est distribuée et la couche de service se trouve sur un autre serveur, auquel cas les Dto sont tenus d'envoyer à travers le réseau pour la sérialisation des raisons.
En général, je serai d'accord et dire non, parce que le modèle de Domaine est généralement le reflet de la logique métier et n'a pas l'habitude de faire en forme par le consommateur de cette logique.
Si vous décidez de les utiliser, je serais d'accord et dire oui à la couche de Service est l'endroit idéal car il est de retour les Dto à la fin de la journée.
Bonne chance!
Il semble que votre demande est grande et assez complexe que vous avez décidé de passer par DDD approche.
Ne renvoyez pas votre poco entités ou soi-disant domaine des entités et des objets de valeur dans vous de la couche de service. Si vous voulez faire cela, puis de les supprimer de votre couche de service parce que vous n'avez pas besoin de plus! Modèle d'affichage ou les objets de transfert de Données doit vivre dans la couche de Service, car ils doivent correspondre au modèle de domaine et vice versa.
Alors, pourquoi avez-vous besoin d'avoir DTO? Dans l'application complexe avec beaucoup de scénarios, vous devez séparer les préoccupations de domaine et vous de présentation de points de vue, un modèle de domaine pourrait être divisé en plusieurs DTO et aussi plusieurs modèles de Domaine pourraient être réduites dans une DTO. Il est donc préférable de créer votre DTO en architecture en couches même il serait le même que celui de votre modèle.
Faut-il toujours utiliser les Dto pour la communication avec la couche de service?
Oui, vous devez retourner DTO par votre couche de service que vous avez parlez-en à votre dépôt de la couche de service avec le modèle du domaine de membres et de les mapper à DTO et de retour à la MVC du contrôleur et vice-versa.
Est-il ok pour ajuster les modèles de domaine basé sur ce que les services de besoin?
Un service juste parle de référentiel et le domaine des méthodes et des services de domaine, vous devez résoudre les affaires dans votre domaine sur la base de vos besoins et ce n'est pas la tâche de service à dire le domaine de ce qui est nécessaire.
Si nous devons strictement Otd, devraient-ils être définis dans la couche de service? Oui essayer d'avoir DTO ou ViewModel juste en service plus tard parce qu'ils doivent être mappés aux membres du domaine dans la couche de service et ce n'est pas une bonne idée de lieux DTO dans les controllers de votre application(essayez d'utiliser Réponse À La Requête De motif dans votre couche de Service), cheers!
Depuis le Modèle de Domaine fournit la terminologie (Ubiquitous Language) pour l'ensemble de votre application, il est préférable d'utiliser de Modèle de Domaine largement.
La seule raison d'utiliser Viewmodel/Otd est une implémentation de Modèle MVC dans votre demande de séparation
View
(tout type de couche de présentation) etModel
(Modèle du Domaine). Dans ce cas, votre présentation et modèle de domaine sont faiblement couplés.Je suppose que vous parlez d'Application/d'Affaires/Domaine de la Logique de services.
Je vous suggère de retourner domaine des entités lorsque vous le pouvez. Si elle est nécessaire pour retourner des informations supplémentaires, il est acceptable de retour DTO qui détient de plusieurs de domaine entités.
Parfois, les personnes qui utilisent la 3ème partie cadres, ce qui génère des proxys sur domaine entités font face à des difficultés d'exposer domaine des entités à partir de leurs services, mais c'est seulement une question de mauvais usage.
Je dirais que c'est assez pour revenir domaine entités dans 99,9% des cas.
Afin de simplifier la création de l'Otd et de la cartographie de votre domaine d'entités vous pouvez utiliser AutoMapper.
Je suis en retard pour cette partie, mais c'est d'un commun, et important, la question que je me sentais obligé de répondre.
Par les "services" voulez-vous dire par "l'Application de la Couche de" décrit par Evan dans le livre bleu? Je vais supposer que vous le faites, auquel cas la réponse est qu'ils doivent pas retour Otd. Je suggère la lecture du chapitre 4 du livre bleu, intitulé "Isoler le nom de Domaine".
Dans ce chapitre, Evans dit ce qui suit au sujet de l'couches:
Il y a de bonnes raisons pour cela. Si vous utilisez le concept de ordre partiel comme une mesure de la complexité du logiciel puis d'avoir une couche dépendent d'une couche au-dessus d'elle ajoute de la complexité, ce qui diminue la maintenabilité.
L'appliquer à votre question, les Dto sont vraiment une carte qui est une préoccupation de l'Interface Utilisateur /couche de Présentation. Rappelez-vous que/a distance inter-process communication est exactement le le but d'un DTO (il est intéressant de noter que, dans ce post Fowler plaide également contre les Dto faire partie d'une couche de service, même s'il n'est pas nécessairement parler langage DDD).
Si votre application de la couche dépend de ceux Otd, il est en fonction sur un calque au-dessus de lui-même et de votre complexité augmente. Je peux vous garantir que cela va augmenter la difficulté de maintenir votre logiciel.
Par exemple, si votre système d'interfaces avec plusieurs autres systèmes ou types de clients, nécessitant chacun leur propre DTO? Comment savez-vous qui DTO une méthode de votre demande de service doit retourner? Comment voulez-vous même de résoudre ce problème si la langue de votre choix ne permet pas la surcharge d'une méthode (la méthode de service, dans ce cas), basé sur le type de retour? Et même si vous trouver un moyen, pourquoi porter atteinte à la Couche d'Application à l'appui d'une couche de Présentation des sujets de préoccupation?
Dans la pratique, c'est une étape sur une route qui se termine dans un spaghetti de l'architecture. J'ai vu ce genre de dévolution et de ses résultats dans ma propre expérience.
Où je travaille actuellement, les services dans notre Application, la Couche de retour des objets du domaine. Nous n'avons pas, c'est un problème depuis l'Interface (c'est à dire de l'INTERFACE utilisateur/Présentation) de la couche est en fonction sur le calque du Domaine, qui est ci-dessous il. Aussi, cette dépendance est réduite à une "référence seulement" type de dépendance parce que:
a) la Couche d'Interface est uniquement en mesure d'accéder à ces objets de Domaine en lecture seule le retour des valeurs obtenues par les appels à l'Application de la couche de
b) méthodes sur les services dans l'Application de la Couche d'accepter que l'entrée "raw" en entrée (valeurs de données) ou les paramètres de l'objet (pour réduire le nombre de paramètres, le cas échéant) défini dans cette couche. Plus précisément, les services d'application jamais accepter des objets de Domaine en entrée.
La Couche d'Interface utilise des techniques de cartographie définie dans l'Interface de la Couche elle-même à la carte à partir d'objets du Domaine de Dto. De nouveau, ce qui maintient les Dto sont les cartes qui sont contrôlées par la Couche d'Interface.
CustomerApplicationService.Save(<input>)
si vous ne connaissez pas les propriétés où ils ont changé (le client peut avoir des dizaines de propriétés) ?Je vous suggère de l'analyse de ces deux questions:
Sont vos couches supérieures (c'est à dire afficher & les modèles de vue /controllers) qui utilise les données d'une manière différente de ce que le domaine de la couche expose? Si il y a beaucoup de cartographie en cours ou même logique, je vous suggère de revoir votre conception: il devrait probablement être plus proche de la façon dont les données sont effectivement utilisés.
Quelle est la probabilité que vous profondément changer vos couches supérieures? (par exemple, la permutation ASP.NET pour WPF). Si c'est très à la différence et à votre architecture n'est pas très complexe, il peut être mieux de les exposer comme beaucoup de domaine entités que vous le pouvez.
J'ai peur c'est un vaste sujet et il a vraiment atteint le degré de complexité de votre système et de ses exigences.
Si vous retourner une partie de votre modèle de domaine, il devient une partie d'un contrat. Un contrat est dur de changer les choses à l'extérieur de votre contexte en dépendent. En tant que tel, vous souhaitez faire partie de votre modèle de domaine est difficile de les changer.
Un aspect très important d'un modèle de domaine est qu'il est facile de changer. Cela fait de nous des flexibles pour le domaine de l'évolution des exigences.
Dans mon expérience, sauf si vous utilisez un OO motif de l'INTERFACE utilisateur (comme nu objets), ce qui expose les objets du domaine à l'INTERFACE utilisateur est une mauvaise idée. Cela parce que la demande augmente, les besoins à partir de l'INTERFACE utilisateur de modifier et de la force de vos objets de façon à tenir compte de ces changements. En fin de compte vous servir 2 maîtres: l'INTERFACE utilisateur et le DOMAINE qui est une expérience très douloureuse. Croyez-moi, vous ne voulez pas être là. L'INTERFACE utilisateur du modèle dispose de la fonction de communication avec l'utilisateur, le modèle de DOMAINE pour tenir les règles d'affaires et de la persistance des modèles traite de stocker des données de manière efficace. Ils ont tous de répondre aux différents besoins de l'application. Je suis en train d'écrire un billet de blog à ce sujet, l'ajouter quand c'est fait.
La fin de la partie, mais je suis confronté exactement le même type d'architecture et je me suis penchée vers “seulement Otd de service”. C'est principalement parce que j'ai décidé d'utiliser uniquement des objets de domaine/agrégats pour maintenir la validité de l'intérieur de l'objet, ainsi que lorsque la mise à jour, la création ou la suppression. Lorsque nous sommes de l'interrogation des données, nous utilisons uniquement des EF comme un référentiel et des cartes le résultat à l'Otd. Ce qui nous rend libre pour optimiser les requêtes de lecture et de ne pas s'adapter à des objets d'affaires, souvent à l'aide de fonctions de base de données, car ils sont rapides.
Chaque méthode de service définit son propre contrat et est donc plus facile à maintenir dans le temps. J'ai de l'espoir.