2011-08-25 15 views
5

Me gustaría usar ConfigurationManager para acceder a algunos valores de cadena de una clase estática. Sin embargo, necesito manejar específicamente la ausencia de un valor o la presencia de valores vacíos. En este momento estaba usando los inicializadores de tipo, comoConfigurationManager & Static Class

private static readonly string someStr = ConfigurationManager.AppSettings["abc"]; 

para hacer el trabajo. Sin embargo, si una cadena con la clave "abc" no existe en App.config la ejecución continuará felizmente con una referencia null en lugar de someStr. ¿Cuál es, entonces, la mejor manera de validar este valor en la inicialización? ¿Un constructor estático en el que inicializo el valor y luego verifico la validez? Escuché que los constructores estáticos deben evitarse y reemplazarse por los inicializadores de tipo cuando sea posible.

Respuesta

6

estoy usando algo como esto:

public static readonly string someStr = 
     ConfigurationManager.AppSettings["abc"] ?? "default value"; 

O para manejar cadena vacía:

public static readonly string someStr = 
      !String.IsNullOrEmpty(ConfigurationManager.AppSettings["abc"]) ? 
          ConfigurationManager.AppSettings["abc"] : "default value"; 
2

constructores estáticos están bien, lo bueno de ellos es que son garantizada por el tiempo de ejecución se ejecutará una sola vez, la primera vez que se usa la clase en cualquier circunstancia.

Se puede usar alternativamente el operador se unen (??) para establecer un valor por defecto:

private static readonly string someStr = ConfigurationManager.AppSettings["abc"] ?? "some default value"; 
4

Esto acaba de llegar en una revisión de código. Las respuestas proporcionadas son excelentes para cadenas. Pero no funcionan para un int o un doble, etc ... Hoy, necesitaba hacer esto para un conteo de reintentos y debe ser un int.

Así que aquí hay una respuesta para aquellos que quieren la conversión de tipo incluida.

Utilice este método de extensión:

using System.Collections.Specialized; 
using System.ComponentModel; 

namespace Rhyous.Config.Extensions 
{ 
    public static class NameValueCollectionExtensions 
    { 
     public static T Get<T>(this NameValueCollection collection, string key, T defaultValue) 
     { 
      var value = collection[key]; 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 
      if (string.IsNullOrWhiteSpace(value) || !converter.IsValid(value)) 
      { 
       return defaultValue; 
      } 

      return (T)(converter.ConvertFromInvariantString(value)); 
     } 
    } 
} 

también tengo pruebas unitarias para ella, que se pueden encontrar aquí: http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

Esperanza que ayuda al individuo siguiente.

+0

Esto está ahora en mi paquete Rhyous.Collections NuGet y puede ver la fuente en GitHub: https://github.com/rhyous/Collections/blob/master/src/Rhyous.Collections/Extensions/NameValueCollectionExtensions.cs – Rhyous