2009-03-27 14 views
52

Frecuentemente necesito crear una biblioteca de clases .Net que requiera app.config para cosas como cadenas de conexión de bases de datos. Sin embargo, estas configuraciones deben estar en app.config o web.config de la aplicación llamante. Si quiero distribuir el archivo DLL a través de múltiples aplicaciones, se convierte en un problema porque tengo que copiar estas configuraciones en cada aplicación app.config.Uso de app.config con una biblioteca de clases

He considerado leer manualmente las configuraciones de configuración a través del código desde el interior de la biblioteca de clases, pero eso también es un gran problema. ¿Alguien tiene alguna sugerencia sobre la mejor forma de cargar la configuración de app.config dentro de una biblioteca de clases?

+0

Posible duplicado de [crear su propia configuración en xml] (http://stackoverflow.com/questions/396139/create-your-own-settings-in-xml) –

Respuesta

5

Una cosa que podría hacer es tener un archivo de configuración separado solo para su biblioteca, entonces solo tiene que tener una referencia en el archivo de configuración de la aplicación de entrada.

Consulte el accepted answer en this question para obtener información sobre esto.

15

Sé que no es lo que quiere escuchar, pero el archivo de configuración del punto de entrada es el lugar lógico para poner estos ajustes. Si cada biblioteca necesitara su propio archivo de configuración, sería tedioso tener que editar cada archivo en lugar de solo uno.

Tendría un archivo de texto con la configuración predeterminada incluida como parte de su biblioteca (y como parte del proyecto) que se puede distribuir con la biblioteca para la configuración de configuración predeterminada (se puede copiar y pegar en la configuración archivo).

+2

Esto se convierte en un PITA real para algo así como un proyecto que es para una referencia de servicio web donde puede seguir actualizando la referencia y seguir actualizando el archivo app.config asociado. No estoy de acuerdo con su análisis: digo que tiene más sentido mantener la configuración del servicio web en la biblioteca de la clase que cualquier referencia que tenga. – Jez

+1

@Jez Entonces deberías presentar eso como una respuesta. No estoy de acuerdo, pero defiéndalo. =) Dicho esto, el problema es que debe realizar pasos manuales para actualizar este archivo de configuración externo, mientras que un archivo app.config no requeriría esos pasos. Además, si tiene que cambiar los puntos finales (más preocupante en entornos corporativos/redes internas) en una aplicación y no en otra, el enfoque general de tener un archivo de configuración separado para la * biblioteca * falla miserablemente debido a las actualizaciones manuales requeridas para hacer esos cambios – casperOne

+0

Bueno, lo que sería mejor en esa circunstancia es que la configuración * referenciando * anula la configuración 'predeterminada' dada en la biblioteca de clases. Lo que realmente apesta es que la configuración en la biblioteca de clases se ignora por completo. No lo presento como respuesta porque no es una respuesta a la pregunta. Ojalá supiera cómo usar 'app.config' con una biblioteca de clases. – Jez

3

Haga que cada biblioteca de clases defina las configuraciones en una sección de configuración personalizada.

A continuación, agregue manejadores de sección personalizados a su archivo process.exe.config.

This MSDN article es bastante completo en su explicación, con ejemplos tanto en VB como en C#.

Se trata de escribir algo de código bastante repetitivo - Dmitryr ha creado this tool para generar las secciones de configuración de un fragmento de una configuración de XML, lo que podría ayudar.

0

No es un (gran) problema utilizar su propio archivo de configuración para cada biblioteca de clases. Si usa vb.net, puede agregar valores a través del panel "mi proyecto" en la página "Configuración".

Lo único que debe hacer es llamar a "My.Settings.Save" en la configuración de la biblioteca de su clase (y no solo en el archivo de configuración de la aplicación principal).

Eso también funciona con C# (pero probablemente necesite más trabajo manual).

0

Si está usando NUnit, nombre su archivo app.config con el mismo nombre que su nombre de archivo de proyecto * .nunit. Entonces, por ejemplo, si llamó a su proyecto "ClassLibraryA.nunit", entonces nombre su archivo de configuración de biblioteca de clase "ClassLibraryA.config". También necesitan residir en la misma carpeta/directorio. NUnit en realidad está usando esto como el archivo de configuración principal.

Si tiene código personalizado, entonces necesita asegurarse de que su app.config (o web.config) haga referencia al archivo app.config de la biblioteca de la clase. La aplicación solo se preocupa por la raíz app.config o web.config. Por lo tanto, debe agregar una sección de configuración personalizada que apunte a la biblioteca de clases app.config.

3

Aquí hay una alternativa.

En lugar de tratar de encontrar la manera de "fusionar" sus app.configs, o incluso la colocación de los elementos de configuración en el archivo DLL (y tratando de evitar lo que es "de diseño"), en primer lugar, intente esto:

Crea tu DLL, pero donde necesites un ítem de configuración, crea una propiedad pública. Cuando crea una instancia de la clase en la DLL, rellena estas propiedades con elementos de configuración de la aplicación propietaria.

Ahora la configuración se administra en el nivel de propietario, y la DLL es portátil, ya que tiene que pasar lo que necesita en tiempo de ejecución.

¡No más DLL.config!

+3

El objetivo de utilizar una biblioteca de clase es el propósito expreso de * no * que el desarrollador de la aplicación de host debe conocer acerca de todas estas cosas. "Ahora la configuración se gestiona a nivel de propietario" es precisamente lo que intentamos evitar. – as9876

0

Puede crear su propio archivo XML (llámalo appConfig.xml o algo si lo desea), use System.Xml en lugar de System.Configuration para leerlo, e inclúyalo junto a su dll.

1

Ir a Propiedades de la aplicación -> pestaña Configuración; agregue su configuración allí.

Use Properties.Settings.Default.<SettingName> para acceder a la configuración. ¡Eso es!

0

Cree su biblioteca de clase en una solución diferente. Si los mantiene en la misma solución, la app.config en la jerarquía más alta se leerá.

Cuestiones relacionadas