2009-12-15 2 views
1

J'ai rencontré un problème récurrent pour lequel je n'ai trouvé aucun bon exemple ou modèle.Comment modéliser des objets de transfert de données pour différents frontaux?

J'ai un service de base qui effectue toutes les opérations de datasbase lourdes et envoie les résultats aux différentes extrémités avant (html, silverlight/flash, services web, etc.). L'une des opérations de service est "GetDocuments", qui fournit une liste de documents basée sur différents critères de filtrage. Si je n'avais qu'un seul frontal, je voudrais emballer le résultat dans une liste de DTO de document (objets de transfert de données) qui ne contient que les données. Cependant, les différentes interfaces ont besoin de différentes quantités de "métadonnées". Le client simple a juste besoin du titre du document et d'une référence de lien. D'autres clients veulent un petit extrait de texte du document, un autre veut aussi une vignette et un troisième veut le nom de l'auteur. C'est essentiellement tout à la mise en œuvre de l'interface graphique ce qui doit être affiché.

Quelle est la meilleure façon de modéliser ceci:

  1. Comme beaucoup de différents DTO (document, DocumentWithThumbnail, DocumentWithTextSnippet)
    • tend à devenir beaucoup de classes
  2. Comme un DTO contenant toutes les données, où choisir le client pour afficher ce
    • Beaucoup de données inutiles envoyées
  3. Comme un DTO où certains champs sont remplis en fonction de ce que le client a demandé
    • Tend à devenir une très grande classe qui doit être étendue au fil du temps
  4. Un DTO mais avec une sorte de champ "Métadonnées" générique contenant les métadonnées demandées.

Ou y at-il d'autres options?

Puisque je veux un service de haute performance, je dois penser à la fois à la charge réseau et aux stratégies de mise en cache.

Est-ce que quelqu'un a de bonnes habitudes ou pratiques qui pourraient m'aider?

+0

http://stackoverflow.com/questions/1440952/why-are-data-transfer-objects-an-anti-pattern – Upperstage

+0

Est Les données vont sur un fil (à savoir accessible via un service Web)? Ou passez-vous des objets C# aux extrémités avant? –

+0

Les données que je passe sur le câble à certains clients, comme JSON sur le web par exemple. @UpperStage - si DTO en soi est un bon choix n'a pas vraiment d'impact sur la question. La question serait valable même si les objets étaient plus complexes. Comment sélectionner les données à envoyer. – Bjorn

Répondre

0

Ce que je voudrais faire est de donner l'extrémité avant la possibilité de demander la présence des métadonnées recherchées (par exemple getDocument (WITH_THUMBNAILS | WITH_TEXT_SNIPPET))

Ensuite, ce DTO est construit avec seulement cette information demandée. L'ajout de toutes les métadonnées possibles est inacceptable, comme vous l'avez dit. Je vais sûrement rester avec une classe définissant toutes les méthodes possibles (getTitle(), getThumbnail()) et si possible, il retournera un espace réservé lorsque la vignette n'a pas été demandée. Quelque chose comme "Image non disponible".

Si vous voulez modéliser cela comme un motif, jetez un oeil aux modèles d'usine.

J'espère que cela vous aide.

0

est-il un coût notable à la création d'un DTO qui a toutes les données l'un de vos points de vue pourraient avoir besoin et l'utiliser partout? Je le ferais, d'autant qu'il vous Isole un changement de condition sur la ligne d'avoir l'une des vues incorporer des données l'une des autres vues utilise

ex. Peut-être que votre vue silverlight/flash ne montre pas le titre lui-même car il est dans le pouce maintenant, mais ils décident qu'ils veulent le trier plus tard.

Pour clarifier les choses, je ne pense necesarily vous devez transmettre toutes les données à chaque fois, mais je pense que votre classe DTO devrait définir tous. Ne tombez pas dans les creux de l'optimisation prématurée ou de la paralysie de l'analyse. Faites d'abord la chose la plus simple, puis justifiez la complexité ajoutée. Jetez tout dans et le profil. Si le perf est inacceptable, optimisez et réessayez.

Questions connexes