2011-05-19 20 views
11

Tengo una biblioteca de clases por el momento y va a necesitar sus propios juegos de aplicaciones y es probable que tenga que cambiarlos y esas cosas.¿Hay alguna forma de garantizar que una biblioteca de clases use su propia configuración de aplicación?

El único problema es que la clase va a ser llamada por una aplicación web que tiene un archivo de aplicación que también tiene claves idénticas a la configuración de la aplicación de biblioteca de clase.

Me gustaría asegurarme de que la biblioteca de clases use su propio archivo de aplicaciones y que no realice cambios en las aplicaciones de la aplicación web.

¿Esto es posible? Parece que cualquier ensamblaje puede cambiar las aplicaciones a través de ConfigurationManager.

EDITAR - Para dar contexto, la biblioteca de clases accede a un conjunto de niveles de datos (que no puedo cambiar) que utiliza un valor en appSettings para obtener la cadena de conexión. El único problema es que la clave es la misma que la cadena de conexión de la aplicación web (que puede o no tener un valor diferente).

No deseo que la biblioteca de clases cambie el valor de configuración de la aplicación para esa clave, y luego haga que la aplicación web comience a acceder a una base de datos diferente.

Respuesta

1

Un dominio de aplicación separado puede usar un archivo de configuración diferente, creo. No estoy seguro de qué otra manera podrías hacerlo.

1

Hay no manera de hacerlo. Simplemente no es cómo funciona .NET.

Considere que la biblioteca de clases se puede usar en dos aplicaciones separadas. Cada aplicación puede necesitar configuraciones diferentes para la misma biblioteca de clase. La única forma en que esto funciona es si uno hace no usa el archivo de configuración de la biblioteca de clases.

+0

No es la única * * camino. Coloque las aplicaciones en carpetas separadas, déle a cada copia de la biblioteca su propia configuración. Esto ciertamente funcionaría, ¿no? (Eso es si .net lo soportaba, lo cual no) –

+0

No me sentaría que no hay _manera_. Es más como que no hay una forma incorporada. –

+0

@zespri: la forma de hacerlo es colocar las aplicaciones en carpetas diferentes, luego configurar app.config o web.config apropiadamente. Coloque la configuración utilizada por la biblioteca en el archivo .config utilizado por la aplicación. –

1

En lugar de utilizar el archivo app/web.config, considere crear su propia clase de configuración que hereda de System.Configuration.SettingsBase.

Su biblioteca de clases puede entonces crear una instancia de una copia de esta implementación de SettingsBase y administrar su propia configuración sin interferir con la configuración que pueda necesitar en otro lugar.

http://msdn.microsoft.com/en-us/library/system.configuration.settingsbase.aspx

La clase configuración sería algo como esto:

sealed class MySettings : SettingsBase 
{ 
    [ApplicationScopedSetting()] 
    [DefaultSettingValue("Default")] 
    public string MySetting 
    { 
     get { return this["MySetting"].ToString(); } 
     set { this["MySetting"] = value; } 
    } 
} 
+0

esa es una idea sensata. Lamentablemente, el nivel de datos al que llama mi biblioteca de clase obtiene la cadena de conexión de las aplicaciones. Es una solución de autogen, no hay mucho que pueda hacer para cambiar eso, me temo. – Diskdrive

1

Puede utilizar ConfigurationManager.OpenMappedExeConfiguration para obtener la configuración para un archivo específico desde el interior de la biblioteca de clases.

// Map the new configuration file. 
var configFileMap = new ExeConfigurationFileMap(); 
configFileMap.ExeConfigFilename = configFile; 

// Get the mapped configuration file 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
    configFileMap, ConfigurationUserLevel.None); 

Here config le dará acceso a AppSettings, ConnectionStrings y Sections. Usted podría crear una abstracción además del acceso al ConfigurationManager para que pueda controlar su acceso y así hacerlo más comprobable, pero eso depende del diseño.

Como mencionó el código generado automáticamente en una de sus respuestas, a veces hay formas de evitarlo.Lo más probable es que la clase esté marcada como parcial y que pueda inicializar con el objeto 'Configuración' correcto y, por lo tanto, la cadena de conexión correcta

1

Nombre su archivo de configuración como se indica a continuación y colóquelo en la misma carpeta que su ensamblaje: [AssemblyName] .dll.config

Actualización: Se puede usar todo lo que se caiga. También usa AppSettingsReader (http://msdn.microsoft.com/en-us/library/system.configuration.appsettingsreader.aspx) para crear configuraciones personalizadas.

ejemplo:

<configuration> 
    <appSettings> 
    <add key="YourCustomSetting" value="10240" /> 
    </appSettings> 

    <system.diagnostics> 
    ... 
    </system.diagnostics> 

    <connectionStrings>... 
    <system.web>... 
    etc, etc. 
</configuration> 
+0

No sabía que pudieras hacer eso. ¿Qué tipo de configuraciones puedes cambiar desde aquí? ¿Es solo appSettings o la usas para más? –

+0

Hola, traté de hacer esto, no parecía funcionar – Diskdrive

+0

Solo busca tu C: \ para "* .dll.config", verás muchos ejemplos de su uso. –

Cuestiones relacionadas