2010-01-06 25 views
5

tengo un sitio ASP.NET MVC que se compone de 3 proyectos en una solución:¿Cómo debo almacenar la configuración de mi sitio ASP.NET MVC?

modelo de dominio (biblioteca de clases - Mantiene LINQ Repo)
DomainServices (biblioteca de clases - Mantiene la lógica de negocios)
WebUI (Sitio ASP.NET MVC)

Necesito un lugar para almacenar una serie de configuraciones para nuestro sitio que se pueden configurar a través de XML.

¿Qué proyecto debería llevar? ¿Alguien tiene un ejemplo de cómo se cargan y luego acceden a su configuración en estos diferentes proyectos?

¿Cargo el archivo XML una vez, en el constructor de alguna clase C# que contiene propiedades para todas mis configuraciones?

¿Alguien me puede dar algunos ejemplos y consejos sobre el almacenamiento de configuraciones en un archivo XML para usar en una solución multiproyecto?

Respuesta

8

Los ajustes generalmente se almacenan en web.config. Todos los ensamblajes tienen acceso a estas configuraciones.

ConfigurationManager.AppSettings["key"] 

es necesario agregar una referencia a System.Configuration.dll

1

Lo almacenaría en un nuevo servicio con una interfaz.

Lo que hago es tener una clase que tenga todas las propiedades/configuraciones. También administraría el archivo XML.

Un contenedor de Inversión de control le permitiría inyectarlos mediante la inyección de dependencia en sus otras clases.

+0

estaba considerando lo que es una clase estática teniendo en cuenta que no creo que necesitaré múltiples instancias de esto. Aunque no estoy seguro – Rinndar

+0

un contenedor de IoC apropiado solo construirá uno por defecto. –

2

Estoy de acuerdo con Mathias utilizar el modo por defecto que ofrece el marco. Sin embargo, puede (debe, en mi humilde opinión) todavía hacer algún tipo de clase de contenedor, probablemente, detrás de una interfaz para facilitar la burla en las pruebas unitarias, por ejemplo:

class MyAppSettings 
{ 
    public int SomeSetting 
    { 
     get 
     { 
     return Convert.ToInt32(ConfigurationManager.AppSettings["SomeSetting"]); 
     } 
    } 
} 
0

definir una propiedad compartida en la biblioteca de clases para mantener la configuración de aplicaciones (una instancia de Specialized.NameValueCollection). Luego, en la lógica de su sitio, establezca esta nueva propiedad en su configuración de ASP.NET desde web.config en Application_Start sub de global.asax.

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
    ' Code that runs on application startup 
    DomainModel.Common.AppSettings = ConfigurationManager.AppSettings 
End Sub 

De esta manera, puede acceder a la configuración de los proyectos de la biblioteca de clase.

7

En lugar de utilizar AppSettings, que es sólo una colección de pares de valores clave, tenga en cuenta la definición de su propia estructura de configuración usando ConfigurationSection o IConfigurationSectionHandler

De esta manera se obtiene toda la seguridad de la clase de contenedor, y no lo hace abarrotar su AppSettings (y está muy bien definido en algún lugar para su uso).

Mejor aún, defina su propio esquema XML y use XmlSerialization/Deserialization para almacenar este archivo fuera de web.config, escuchando los cambios en él (átelo al caché, lo que sea).

Si lo hace de esta manera, no necesita modificar web.config para obtener los cambios y, por lo tanto, no necesita reiniciar su aplicación web, perdiendo sesión/caché en el proceso.

No es que bien escritos aplicaciones sin estado web deben preocuparse por la pérdida de la sesión/cache - pero siempre hay alguien ... :)

Cuestiones relacionadas