2010-11-07 12 views
5

Tengo una aplicación que usa SQLite, que es extremadamente liviana y rápida. Tengo algunas preferencias que no necesariamente tienen que cargarse al inicio, pero es posible que deban usarse varias veces según el destino del usuario. Dicho esto, no puedo decidir dónde almacenar esta información.Aplicación C#: ¿almacenamiento de preferencias en la base de datos o archivo de configuración?

Q1: ¿Debo continuar y almacenarlo en la base de datos? ¿Debo almacenarlo en un archivo de configuración?

P2: ¿Debo cargar y almacenar las preferencias y otros datos en el arranque, incluso si no están necesariamente siendo utilizados de inmediato? ¿O debería consultar la base de datos cuando los necesito?

Ejemplo: Mi aplicación puede almacenar la información de la compañía para la empresa que está utilizando el software. Nombre de la compañía, teléfono de la compañía, etc. La única vez que se usa esta información es cuando el software imprime automáticamente una letra, o el usuario va a editar la información de su compañía en el programa.

EDITAR: Me he dado cuenta de que esto se reduce a la configuración de la aplicación frente a la configuración del usuario. Mi programa no tiene múltiples usuarios por copia del software. Dicho esto, supongo que estos serían los ajustes de la aplicación.

+0

cargando cuando sea necesario la primera vez frente a la carga en el inicio de la aplicación es una preferencia personal. Cargando cuando primero se necesita permite un tiempo de inicio más rápido. Las búsquedas de Singleton como esa (donde lo carga en un singleton en el primer acceso) tienen un impacto insignificante, pero pueden tener un efecto de IU definido. Considere cómo se carga Photoshop (donde carga TODO antes de darle la UI) versus la pausa que obtiene en algunas aplicaciones cuando carga cosas y obtiene esa molesta pantalla de espera por favor. – jcolebrand

+0

@drachenstem Y también puede cargar cosas en segundo plano y dejar que el usuario espere a que se cargue si no está cargado. Al igual que Visual Studio. A veces, el caché de documentación no está construido, pero lo será si lo necesita –

+0

Muy cierto, pero en su mayor parte, los datos que voy a cargar son de un tamaño muy pequeño, el usuario ni siquiera debe darse cuenta. – OogaBooga

Respuesta

3

¿Cuántas configuraciones quieres ahorrar? Usar la función de configuración integrada es bastante sencillo.

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

+0

No muchos en realidad. Nunca he oído hablar de esto ... Lo leeré. – OogaBooga

+0

No recomendaría esto para la configuración de "Usuario", solo la configuración de "Aplicación". Si usa la configuración de "Usuario", los valores se almacenan en la carpeta APPDATA en un nombre de carpeta extraño que cambia para cada versión de la aplicación, de modo que si el usuario se actualiza, desaparecen todas las configuraciones anteriores. –

+0

Me he dado cuenta de que esto se reduce a la configuración de la aplicación frente a la configuración del usuario. Mi programa no tiene múltiples usuarios por copia del software. Dicho esto, supongo que estos serían los ajustes de la aplicación. En ese caso, supongo que la respuesta de JTA sería la mejor para mi problema. Si alguien tiene alguna razón por la cual esto no sería así, ¡házmelo saber! – OogaBooga

1

Almacenamiento de datos de configuración en un archivo es bueno para la configuración de peso ligero que rara vez cambian. Por lo general, harías esto para configuraciones que son diferentes entre desarrollo y producción y que se usan para poner en funcionamiento tu aplicación.

Después de eso, todo lo demás se almacena mejor en una base de datos. Esto le da la opción de buenas interfaces de usuario para modificar las configuraciones, cargarlas cuando sea necesario, guardarlas durante las actualizaciones de su sistema, estar disponible si usa múltiples interfaces (en lugar de guardar la configuración en un archivo y garantizar que todo -finaliza tienen los mismos archivos en marcha hasta la fecha.)

3

Lo que es posible que desee hacer es escribir una clase que encapsula la configuración y luego los lee en la tabla hash.

usted podría tener un método GetSetting básica que mira hacia arriba un entorno basado en un nombre. Si la configuración se encuentra en la tabla Hash, devuelva el valor; de lo contrario, vaya a la base de datos para encontrar la configuración y luego guárdela en la tabla Hashtable. Luego puede escribir propiedades separadas para cada configuración que desee, cada una de las cuales llama a los métodos GetSetting/SetSetting.

Esto le permite almacenar los ajustes en la base de datos fácilmente, y almacena en caché los lee constantemente para evitar la lectura de la base de datos.

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 
    } 
} 

A continuación, basta con crear una clase con un montón de propiedades como esta:

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

Ahora usted puede hacer esto en su código:

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

Agradezco su explicación en profundidad y ejemplos de código, pero como mi comentario indica debajo de la publicación de JTA, creo que sería el más adecuado para usar su solución, dado que mi configuración sería la configuración de la aplicación. – OogaBooga

0

Además de JTAS responder lo haría me gusta agregar que he usado 3 métodos y todos tienen sus lados arriba y abajo.

  1. El almacenamiento en la incorporada en uno no realmente les bloquee al usuario que ejecuta . Entonces, por ejemplo, si usuarios múltiples usan su aplicación, allí serán ajustes independientes para cada usuario. Si esto es lo que quiere, elija este.
  2. Almacenándolos en la base de datos es útil si no desea que sea vinculado a un usuario sino a la base de datos . Aunque no puede cambiar estas configuraciones desde fuera de la aplicación.

  3. He utilizado una clase de configuración que I serializar con XML si necesito editar con un editor xml. Por ejemplo, , esto es muy útil si tiene ejecutando un servicio.

Cuestiones relacionadas