2010-11-07 5 views
5

J'ai une application qui utilise SQLite, qui est extrêmement léger et rapide. J'ai certaines préférences qui n'ont pas nécessairement besoin d'être chargées au démarrage, mais qui peuvent avoir besoin d'être utilisées à différents moments selon l'endroit où l'utilisateur se rend. Cela étant dit, je ne peux pas décider où stocker cette information.C# Application - stockage des préférences dans la base de données ou le fichier de configuration?

Q1: Devrais-je simplement aller de l'avant et le stocker dans la base de données? Dois-je le stocker dans un fichier de configuration? Q2: Dois-je charger et stocker les préférences et autres données au démarrage même si elles ne sont pas nécessairement utilisées immédiatement? Ou devrais-je simplement interroger la base de données quand j'en ai besoin? Exemple: Mon application peut stocker les informations sur la société pour l'entreprise qui utilise le logiciel. Nom de la société, téléphone de la société, etc. La seule fois où cette information est utilisée, c'est lorsque le logiciel imprime une lettre, ou que l'utilisateur va modifier les informations de son entreprise dans le programme.

EDIT: J'ai réalisé que cela se résume aux paramètres de l'application par rapport aux paramètres utilisateur. Mon programme n'a pas plusieurs utilisateurs par copie du logiciel. Cela dit, je suppose que ce seraient des paramètres d'application.

+0

chargement lorsque cela est nécessaire la première fois par rapport au chargement au démarrage de l'application est une préférence personnelle. Le chargement en cas de besoin permet un démarrage plus rapide. Les recherches Singleton comme celles-ci (où vous les chargez en singleton au premier accès) sont des impacts négligeables, mais peuvent avoir un effet d'interface utilisateur certain. Considérez comment Photoshop charge (où il charge TOUT avant de vous donner l'interface utilisateur) par rapport à la pause que vous obtenez dans certaines applications lorsque vous chargez des choses et obtenez cet écran d'attente-s'il vous plaît ennuyeux. – jcolebrand

+0

@drachenstem Et vous pouvez également charger les choses en arrière-plan et laisser l'utilisateur attendre qu'il se charge s'il n'est pas chargé. Tout comme Visual Studio. Parfois, le cache de documentation n'est pas construit, mais le sera s'il le faut. –

+0

Très vrai, mais pour l'essentiel, les données que je vais charger sont de très petite taille, l'utilisateur ne devrait même pas le remarquer. – OogaBooga

Répondre

3

Combien de paramètres souhaitez-vous enregistrer? L'utilisation de la fonction intégrée des paramètres est assez indolore.

http://msdn.microsoft.com/en-us/library/aa730869.aspx

+0

Pas trop du tout en fait. Je n'ai jamais entendu parler de ça ... Je vais le lire. – OogaBooga

+0

Je ne recommanderais pas cela pour les paramètres "Utilisateur", uniquement les paramètres "Application". Si vous utilisez les paramètres "Utilisateur", les valeurs sont stockées dans le dossier APPDATA dans un nom de fichier bizarre qui change pour chaque version de l'application, ce qui fait que si l'utilisateur met à jour, tous ses paramètres précédents disparaissent. –

+0

J'ai réalisé que cela se résume aux paramètres de l'application par rapport aux paramètres de l'utilisateur. Mon programme n'a pas plusieurs utilisateurs par copie du logiciel. Cela dit, je suppose que ce seraient des paramètres d'application. Dans ce cas, je suppose que la réponse de JTA serait la meilleure pour mon problème. Si quelqu'un a une raison pour laquelle cela ne serait pas le cas, faites le moi savoir! – OogaBooga

1

Le stockage des données de configuration dans un fichier est bon pour les réglages légers qui changent rarement. Habituellement, vous le faites pour les paramètres qui diffèrent entre le développement et la production et sont utilisés pour que votre application soit opérationnelle.

Ensuite, tout le reste est mieux stocké dans une base de données. Cela vous donne l'option de bonnes interfaces utilisateur pour modifier les paramètres, les charger au besoin, les sauvegarder pendant les mises à niveau de votre système, être disponible si vous utilisez plusieurs frontaux (par rapport à l'enregistrement de la configuration dans un fichier -end les mêmes fichiers mis-à-jour.)

3

Ce que vous pouvez faire est d'écrire une classe qui encapsule les paramètres et les lit ensuite dans Hashtable.

Vous pouvez avoir une méthode de base GetSetting qui recherche un paramètre basé sur un nom. Si le paramètre se trouve dans la table de hachage, renvoyez la valeur, sinon, accédez à la base de données pour trouver le paramètre, puis stockez-la dans la table de hachage. Vous pouvez ensuite écrire des propriétés séparées pour chaque paramètre que vous voulez, appelant chacune les méthodes GetSetting/SetSetting.

Cela vous permet de stocker facilement les paramètres dans la base de données et de mettre en cache les lectures pour éviter de lire constamment la base de données.

public class Settings { 
    private object SyncRoot = new object(); 
    private System.Collections.Hashtable _cache = new System.Collections.Hashtable(); 

    public T GetSetting<T>(string xPath, T defaultValue) 
    { 
     lock (SyncRoot) 
     { 
      if (!_cache.ContainsKey(xPath)) 
      { 
       T val = GetSettingFromDB<T>(xPath, defaultValue); 
       _cache[xPath] = val; 
       return val; 
      } 
      return (T)_cache[xPath]; 
     } 
    } 

    public T GetSettingFromDB<T>(string xPath, T defaultValue) 
    { 
     // Read from DB 
    } 

    public void SaveSetting<T>(string xPath, T value) 
    { 
     lock (SyncRoot) 
     { 
      if (_cache.ContainsKey(xPath)) 
       _cache[xPath] = value; 
     } 

     SaveSettingToDB<T>(xPath, value); 
    } 

    public T SaveSettingToDB<T>(string xPath, T defaultValue) 
    { 
     // Read from DB 
    } 
} 

Ensuite, il suffit de créer une classe avec un tas de propriétés comme ceci:

public static bool BooleanFeature 
    { 
     get { return Settings.GetSetting<bool>("BooleanFeature", true); } 
     set { Settings.SaveSetting<bool>("BooleanFeature", value); } 
    } 

Maintenant, vous pouvez le faire dans votre code:

if (Setting.BooleanFeature) { 
    // Run certain code 
else { 
    // Run other code 
} 
+0

J'apprécie votre explication en profondeur et exemples de code, mais comme mon commentaire indique ci-dessous le poste de JTA, je pense que je serais le mieux adapté pour utiliser sa solution étant donné mes paramètres seraient les paramètres de l'application. – OogaBooga

0

En plus de JTA je répondrais J'aime ajouter que j'ai utilisé 3 méthodes et ils ont tous leurs côtés hauts et bas.

  1. les Stockage dans celui intégré ne les tiennent véritablement à l' utilisateur en cours d'exécution. Par exemple, si plusieurs utilisateurs utilisent votre application, seront des paramètres indépendants pour chaque utilisateur. Si c'est ce que vous voulez, choisissez celui-ci.
  2. Les stocker dans la base de données est utile si vous ne voulez pas qu'il soit lié à un utilisateur mais plutôt à la base de données . Bien que vous ne pouvez pas modifier ces paramètres de l'extérieur de l'application.

  3. J'ai utilisé une classe config que je série avec XML si j'ai besoin d'éditer avec un éditeur xml. Par exemple cela est très utile si vous êtes en cours d'exécution d'un service.

Questions connexes