2011-06-25 14 views
7

Digamos que tenemos Assembly1 y Assembly2.Repitiendo la configuración en ensambles referenciados

Assembly2 es una biblioteca de clase C# utilizada por Assembly1.

Referencias web y de servicio se configuran y almacenan en Asembly2/app.Config.

Además, las cadenas de conexión EF están en Assembly2/app.Config.

Cuando uso Assembly2 en Assembly1, el archivo de configuración Assembly2 no se utiliza. De hecho, en ese escenario, solo la configuración de Assembly1 aparece accesible por medios predeterminados.

Como resultado, tengo que copiar los contenidos de configuración de Assembly2 en la configuración de Assembly1.

Esto me ha funcionado para muchos proyectos.

¿Hay alguna otra manera? ¿Una mejor manera?

Parece incorrecto tener datos de configuración repetitivos.

¿Tiene alguna recomendación o técnica que funcione?

Gracias.

Respuesta

4

Debe aplicar los cambios al archivo de configuración del ensamblado del punto de entrada exe. Los archivos de configuración del conjunto de la biblioteca de clases (dll) nunca se utilizan. Están hechos por Visual Studio para que pueda copiar fácilmente las configuraciones a los archivos de configuración de exe si es necesario.

A continuación se muestra un ejemplo del archivo de configuración para el ensamblado exe que tiene ambas configuraciones de la biblioteca de clases ClassLibrary1 y las configuraciones del ensamblado exe MainAssembly. Puede ver que ambas cadenas de conexión están en una configuración connectionStrings. Sin embargo, si necesita establecer otras configuraciones, al lado de la cadena de conexión, necesita agregar una sección adicional.

Si ya está utilizando esta técnica, esta es la forma correcta de hacerlo. Esta técnica es flexible. Por ejemplo, si tiene más de un proyecto con las mismas cadenas de conexión en un cuadro, puede especificar las cadenas de conexión en el archivo machine.config. También puede anular las configuraciones en algunos proyectos si es necesario.

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="applicationSettings" 
        type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 

     <!--This section declaratrion pasted here from dll conifg file --> 
     <section name="ClassLibrary1.Properties.Settings" 
       type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       requirePermission="false" /> 

     <!--This section declaratrion was here in the first place --> 
     <section name="MainAssembly.Properties.Settings" 
       type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 
    <connectionStrings> 

    <!--This connection string was here in the first place --> 
    <add name="MainAssembly.Properties.Settings.MainAssemblyConnectionString" 
     connectionString="MainConnectionStringValue" /> 

    <!--This connection string pasted here from dll config file --> 
    <add name="ClassLibrary1.Properties.Settings.LibraryConnectionString" 
     connectionString="LibraryConnectionStringValue" 
     providerName="" /> 
    </connectionStrings> 
    <applicationSettings> 

    <!--This settings section pasted here from dll config file --> 
    <ClassLibrary1.Properties.Settings> 
     <setting name="LibrarySetting" 
       serializeAs="String"> 
     <value>LibrarySettingValue</value> 
     </setting> 
    </ClassLibrary1.Properties.Settings> 

    <!--This strings section was here in the first place --> 
    <MainAssembly.Properties.Settings> 
     <setting name="MainAssemblySetting" 
       serializeAs="String"> 
     <value>MainSettingValue</value> 
     </setting> 
    </MainAssembly.Properties.Settings> 
    </applicationSettings> 
</configuration> 
2

Una DLL (u otro ensamblado al que se hace referencia) no está diseñada para llevar su propia aplicación.config, sino que tiene todo configurado por la persona que llama. Entonces, todo debería entrar en la aplicación. Config. Del exe.

Considere, por ejemplo, una biblioteca de acceso a datos compartidos que necesita cadenas de conexión a la base de datos. La biblioteca debe poder usarse desde una variedad de aplicaciones con diferentes requisitos de conexión. Tener la cadena de conexión atada estrictamente a la biblioteca compartida no funcionaría, tiene que hacerse en el cliente que usa la biblioteca.

Es posible poner la configuración de todo el sistema que afectan a todas las aplicaciones que se ejecutan en una máquina en el archivo machine.config, pero el uso de este enfoque con precaución ya que afectará a todos los aplicaciones en la máquina.

Cuestiones relacionadas