2009-06-26 6 views
0

J'ai une situation où j'ai plusieurs lignes dans une base de données. Par exemple, disons que nous avons une table appelée ReportRendererType.Architecture suggérée pour associer du code à des lignes db

lignes pourraient être:

  • Ligne Graphique
  • Bar Graph
  • Grille

etc.

Je peux utiliser la base de données pour stocker comment les utilisateurs veulent voir notamment rapports particuliers. Par exemple. Frank aime le rapport sur les bénéfices affiché sous forme de graphique à barres. Ce serait bien si je pouvais associer du code avec l'entrée dans le db. En d'autres termes, ce serait génial si la classe LineGraphRenderer savait qu'elle était associée à la ligne 1 de la table ReportRenderType. Un exemple trivial de la raison pour laquelle cela serait utile est que vous pourriez remplir une liste déroulante des options ReportRenderType, puis sélectionner une valeur et une classe Manager pourrait facilement comprendre comment afficher le rapport étant donné la valeur sélectionnée dans la liste déroulante. La question est alors - comment faites-vous l'association entre la DB et ce morceau de code.

Il y a beaucoup d'options:

A. Lorsque vous prenez la classe LineGraphRenderer, vous pourriez avoir un ReportRendererType de propriété qui retourne la clé primaire de la ligne associée.

B. Vous pourriez avoir un LineGraphRenderer renvoyer une énumération qui avait une valeur de la clé primaire (C# vous permet de le faire en définissant explicitement la valeur du code de hachage) cela donne un typage statique, et un seul emplacement pour tous les db Entrées

C. Vous pouvez avoir une propriété ReportRendererType sur LineGraphRenderer qui a renvoyé la clé primaire mais récupéré la valeur de la ligne associée à partir d'un fichier de paramètres. Cela faciliterait la création des associations, en particulier si quelqu'un d'autre a des valeurs de clé primaire différentes. Par exemple, la société A pourrait avoir LineGraph stocké dans la ligne 1, mais la société B pourrait avoir LineGraph stocké dans la ligne 2.

Malheureusement, toutes ces façons semblent également avoir des inconvénients. Je me demande comment ce problème a été abordé par d'autres et s'ils ont trouvé d'excellentes façons de faire les choses qui me manquent.

Répondre

0

J'ai eu un problème similaire.

Vous pouvez définir une interface pour la classe Renderer. Ensuite, vous implémentez un Renderer de base (Line Graphe peut-être) et toutes vos autres classes de Renderer. Le vous avez un RendererFactory qui a GetRenderer. Ensuite, vous donnez ce Paramètre d'Usine et l'Usine cann regarde la DB que le Renderer utilisera. Si l'usine n'a rien trouvé, utilisez le moteur de rendu par défaut.

Peut-être que quelque chose comme ça est une idée.

1

Je suggère que vous pas code associé avec des lignes de base de données! Ceci est tout à fait contraire à la séparation des préoccupations.

Pour être honnête, ce n'est pas tout à fait l'idée la plus stupide que j'ai jamais entendue; mais c'est assez proche.

+0

Élevé. Silly n'est peut-être pas le bon mot, mais c'est un anti-pattern. – marr75

+0

J'avais l'habitude d'avoir des idées comme ça. Quand j'étais plus jeune, et je suis resté jusqu'à 3 heures du matin sur le sucre et la caféine. J'en ai grandi et je suis devenu capable de voir les limites entre les choses. –

+0

Donc, si vous vouliez représenter quelque chose (comme la façon dont vous devriez afficher un graphique), vous auriez besoin de stocker des informations dans la base de données. À un moment donné, vous devez déterminer quel code va fonctionner en fonction de cette information. Quelle serait une meilleure approche? À un moment donné, vous devez associer cette ligne au code, n'est-ce pas? – Daniel

1

J'utilise beaucoup l'option B.Cela repose sur deux choses:

  1. Les valeurs ne sont pas soumis à des changements fréquents (ce qui nécessite une modification de code et re-construction)
  2. La base de données est correctement normalisée afin que vous énumérez la clé primaire, par exemple , ReportRendererType qui est utilisé dans la base de données en tant que clé étrangère (dans votre table Customer par exemple).

Cela fonctionne très bien car vous pouvez référencer les valeurs énumérées directement dans les requêtes et les mises à jour de base de données. Si vous planifiez un peu en avance, vous pouvez également créer les noms de types énumérés afin qu'ils puissent être facilement affichés dans une interface utilisateur en divisant le texte par une lettre majuscule. 'BarGraph' devient 'Bar Graph' par exemple.

Cela dépend si vous voulez que votre code soit étroitement couplé à votre base de données ou non. Personnellement, je suis à l'aise avec cela, mais d'autres ne le sont peut-être pas.

Questions connexes