2008-10-20 5 views
0

Nous travaillons sur un système d'information hospitalier écrit en C# et utilisant NHibernate pour mapper des objets à la base de données. Le modèle MVC est utilisé pour séparer la logique métier de l'interface utilisateur. Voici le problème,Obtention d'ensembles de chaînes dans le calque de présentation

Comment obtenez-vous différents ensembles de chaînes de taille variable à l'interface utilisateur?

Par exemple, un objet Contact possède une propriété nommée City qui contient le contact de la ville. Dans le pays où l'application est écrite pour plus de 80 villes. Comment pourriez-vous écrire ces villes dans une zone de liste déroulante? (ou une grille de données, des tableaux, ...) Dans cet exemple, le numéro de ville est fixe. Il n'est pas nécessaire d'ajouter une autre ville pendant longtemps. (Si la liste des villes change, recompiler n'est pas un problème)

Par exemple, un objet Contact a une autre propriété nommée FooBar qui va contenir 1000 valeurs de chaînes différentes et ces valeurs vont être sélectionnées dans une liste déroulante pour cette propriété. Et cet ensemble peut être développé si les utilisateurs le veulent. Comment charger la combo avec ces valeurs? (Si la liste de chaînes statiquement écrit à l'objet zone de liste déroulante, la recompilation est un problème)

J'ai différentes solutions comme ci-dessous

  1. Toutes les valeurs de chaîne statiquement écrit zone de liste déroulante dans le code ou le concepteur
  2. Obtenez le les valeurs d'un fichier de ressources
  3. Écrivez ces valeurs à un fichier XML (en fait, comme ci-dessus, mais pas besoin de recompiler)
  4. Faire un objet City et obtenir les valeurs dans une liste de CITY table avec NHibernate
  5. Créez une classe nommée StringHolder qui a une propriété Type et Value. Toutes les valeurs de chaîne (y compris City et FooBar) seraient écrites dans une seule table nommée STRINGHOLDER. Et obtenez ces valeurs avec une clé comme "CITY" ou "FOOBAR" avec NHibernate.

Lequel choisiriez-vous? Ou pourriez-vous me suggérer un autre?

Merci à tous

Répondre

0

Si les emplacements vont réellement être utilisés pour n'importe quoi, placez-les dans la base de données. Si les données "ne sont pas vraiment utilisées", mais que la recherche de villes est fournie pour améliorer l'interface utilisateur, l'option de fichier XML n'est pas non plus un mauvais choix.

Par utilisé, je veux dire des choses comme liste tous les emplyees à New York et d'autres choses comme ça. Si c'est "dead data", juste pour être affiché, optez pour les solutions qui nécessitent le moins de travail et le moins de risque - ce qui pourrait être l'option de fichier.

+0

Par exemple, chaque contact ajouté à la base de données possède un champ City et FooBar provenant de zones de liste déroulante. Donc, ce n'est pas si mort :) Dans certains ensembles de chaînes, certaines des valeurs de chaîne ont plus de 100 caractères. Pour chaque contact, une ligne ajoutée et toutes les lignes prendront 100 caractères pour un seul champ. – xelon

+0

Si je fais comme ça il y a un problème de "normalisation". La plupart des lignes d'une table auront la même valeur sur le champ FOOBAR. Si je fais des classes pour chaque ensemble de valeurs de chaîne, la conception du domaine va être désordonné :) Les deux ont des avantages et des inconvénients. Que dis-tu? – xelon

+0

Je m'en tiens à ce que j'ai dit. Votre modèle de domaine devrait idéalement ne pas se soucier un peu de l'apparence de la base de données, les classes de domaine devraient ressembler à la façon dont vous voulez que votre code fonctionne. Mais si vous stockez les villes dans DB, je voudrais normaliser et avoir une table de ville séparée avec des ID. –

1

je voterais pour la solution n ° 4. C'est comme ça que je l'ai toujours fait dans des situations similaires. Cela semble juste comme une solution plus propre.

+0

Mais City va tenir juste une chaîne. Pensez-vous qu'il est bon pour le modèle de domaine? Public class { private string _name; Nom de la chaîne publique { get {return _name;} ensemble {_name = valeur;}} } Il va être beaucoup de classes comme ça si je ne l'utilise l'héritage. – xelon

+0

Si j'utilise l'héritage, il y aura beaucoup de classes vides comme Contact, FooBar etc. Que pensez-vous? – xelon

+0

Si City va juste tenir une ficelle et ne jamais être utilisé pour quoi que ce soit d'autre, alors une table peut être exagérée. Mais, plusieurs fois que le code est en production, vous pouvez trouver de nouveaux usages/besoins. Personnellement, j'utilise des tables de recherche/objets de domaine pour des entités telles que la ville (Etats, Pays). –

0

Comment vous sentez-vous d'utiliser Liste < chaîne > pour une liste de ville? Chargez cette liste de chaînes dans votre DAL ou BL, puis transmettez-la à l'interface utilisateur.

La même solution devrait également être bonne pour les valeurs FooBar.Dans le cas où vous avez des ID associés à City ou FooBar, disons NY et son ID numérique dans DB est 1, alors vous pouvez utiliser KeyValuePair < TKey, TValue >. Avec les génériques, vous pouvez dicter quelles données vont dans ce KeyValuePair. Le nom de la ville ou la valeur de chaîne de FooBar peut être une clé et l'ID numérique peut être une valeur.

Juste 2 cents.

Questions connexes