2012-05-15 7 views
6

tengo una clase llamada LocalConstants ....Acceso constantes de clase estática que hace referencia a configuración de la aplicación de configuración del archivo

public static class LocalConstants { 
    public static string DM_PATH = ConfigurationManager.AppSettings["DMQueue"]; 
    public static string PROJECT_PATH = ConfigurationManager.AppSettings["MSQueue"]; 
} 

Al intentar acceder a esta clase en mi programa principal que estoy recibiendo una excepción de referencia nula. Cualquier cosa desde ConfigurationManager.AppSettings [siempre es nula. Pero si escribo

//The value is returned fine 
    string bo=ConfigurationManager.AppSettings["MSQueue"]; 

esta compila bien, pero siempre es nula y lanza una NullRefexception

string moomoo = LocalConstants.PROJECT_PATH; 

La excepción es el inicializador de tipo 'TestCodeOutOnSide.LocalConstants' produjo una excepción.

La innerException es la referencia de objeto básica no establecida en una instancia de un objeto.

Incluso si cambio el project_path a

public static readonly string PROJECT_PATH = @"FORMATNAME:DIRECT=OS:serus-nickl\RMQDEV"; 

tengo la misma excepción

¿Alguna idea?

+0

Es 'LocalConstants' en la misma pr oject como la aplicación.config? – IAbstract

+0

Sí, todo está en el mismo proyecto –

Respuesta

0

me llamaron a este

public static string Environment = AppEnvironmentVariable.ToUpper() != "PROD" ? "***FROM " + AppEnvironmentVariable.ToUpper() + "** " : ""; 

Antes de esta

public static string AppEnvironmentVariable = "DEV"; 

En el archivo LocalConstants que se rompió a causa de lo que dijo Josh sobre la inicialización de campo estático

5

Para empezar, si está haciendo esto para proporcionar algún tipo de beneficio de rendimiento, entonces debe saber que están en caché. Vea ConfigurationManager.AppSettings Caching, para eliminar cualquiera.

En segundo lugar, el problema es que Static field initialization no funciona como usted espera. Por lo tanto, su código tal como está escrito no garantiza que se haya ejecutado ConfigurationManager.AppSettings. Desde el código de ejemplo el artículo relacionado:

podría producir ya sea la salida:

Init A 
Init B 
1 1 

o la salida:

Init B 
Init A 
1 1 

[EDITAR por comentario OP]

Debe haber algo más involucrado como:

public static class LocalConstants 
{ 
    public static string DM_PATH = "DMQueue"; 
    public static string PROJECT_PATH = "MSQueue"; 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     string moomoo = LocalConstants.PROJECT_PATH; 

     Console.WriteLine(moomoo); 
    } 
} 

funciona para mí.

[Editar 2 - Fro los que vienen detrás]

Parece que The type initializer for ‘SomeClass’ threw an exception puede ser un caso en el que

Pero cuando se llama por el diseñador WPF, la "aplicación" es Visual Studio, que (presumiblemente) no tiene las cadenas de conexión apropiadas en su.archivo de configuración;

La solución a ese autor fue:

mover la creación de instancias de mi modelo de datos de entidad en una propiedad

+0

¿Alguna sugerencia sobre una mejor manera de abordar esto? –

+0

@NickLaMarca ¿Por qué no te gusta 'string moomoo = ConfigurationManager.AppSettings [" MSQueue "];'? ¿Qué estás tratando de lograr con tu clase 'LocalConstants'? –

+0

El requisito no es cadenas mágicas o referencias de ConfigurationManager en el código. Quería todo en 1 archivo. Acabo de tomar todas las cadenas en el ConfigurationManager y ponerlas directamente en la clase LocalConstants y aún lanzar una excepción y devolver nulo –

0

Usted podría intentar hacerlos readonly

public static readonly string PROJECT_PATH = ConfigurationManager.AppSettings["MSQueue"]; 

readonly los campos pueden cargarse de forma diferida

+0

Desafortunadamente esto no funciona –

0

¿Por qué no probar algo como:

public static string ProjectPath 
    { 
     get 
     { 
      return ConfigurationManager.AppSettings["MSQueue"]; 
     } 
    } 
+0

Proporcione una descripción/explicación del fragmento de código. –

Cuestiones relacionadas