Domanda

In un progetto .NET, supponiamo di avere un'impostazione di configurazione, come una stringa di connessione, archiviata in un file app.config, che è diverso per ogni sviluppatore del tuo team (potrebbero utilizzare un SQL Server locale o un'istanza del server specifica o utilizzando un server remoto, ecc.).

Come puoi strutturare la tua soluzione in modo che ogni sviluppatore possa avere le proprie "preferenze" di sviluppo (ad es.non archiviato nel controllo del codice sorgente), ma fornire una stringa di connessione predefinita che viene archiviata nel controllo del codice sorgente (fornendo così le impostazioni predefinite corrette per un processo di compilazione o nuovi sviluppatori).


Modificare:Può il "file" il metodo suggerito da @Jonathon può essere in qualche modo utilizzato con il file connectionStrings sezione?

È stato utile?

Soluzione

AppSettings può essere sovrascritto con un file locale:

<appSettings file="localoveride.config"/>

Ciò consente a ogni sviluppatore di mantenere le proprie impostazioni locali.

Per quanto riguarda la stringa di connessione, in un mondo perfetto tutti gli sviluppatori dovrebbero connettersi a un DB di test, non eseguire SQL Server ciascuno.

Tuttavia, ho ritenuto che fosse preferibile mantenere un file denominato Web.Config.Prd nel controllo del codice sorgente e utilizzarlo per le distribuzioni di build.Se qualcuno modifica web.config, deve anche aggiungere la modifica al file .PRD...Non c'è una buona automazione lì :(

Altri suggerimenti

Modificare:Il metodo "File" suggerito da @Jonathon può essere utilizzato in qualche modo con la sezione ConnectionStrings?

Oppure puoi avere più stringhe di connessione nel file di configurazione archiviato e utilizzare una chiave AppSettings per determinare quale ConnectionString deve essere utilizzata.Ho quanto segue nel mio codebase per questo scopo:

public class ConnectionString
{
    public static string Default
    {
        get 
        { 
            if (string.IsNullOrEmpty(ConfigurationManager.AppSettings["DefaultConnectionStringName"]))
                throw new ApplicationException("DefaultConnectionStringName must be set in the appSettings");

            return GetByName(ConfigurationManager.AppSettings["DefaultConnectionStringName"]);
        }
    }

    public static string GetByName(string dsn)
    {
        return ConfigurationManager.ConnectionStrings[dsn].ConnectionString;
    }
}

Creo sempre modelli per i miei file di configurazione.

Ad esempio utilizzo NAnt per la realizzazione dei miei progetti.Ho archiviato un file chiamato local.properties.xml.template.La mia build NAnt avviserà lo sviluppatore se local.properties.xml non esiste.All'interno di quel file ci saranno le impostazioni specifiche della workstation.Il modello verrà archiviato nel controllo del codice sorgente, ma la configurazione effettiva non lo sarà.

Utilizzo un design piuttosto arcaico che funziona e basta.

  • /_Test__app.config
  • /_Prod__app.config
  • /app.config

Quindi nel mio script nant, ho un'attività che copia l'ambiente di build corrente più _ app.config e lo copia in app.config.

È brutto, ma non puoi intrometterti tra i provider e ConfigurationManager per falsificarlo, dicendo che i provider guardano la stringa di connessione "dev" o "prod" e hanno solo 3 stringhe di connessione denominate.

compito non importante:

<target name="copyconfigs" depends="clean">
  <foreach item="File" property="filename" unless="${string::get-length(ConfigPrefix) == 0}">
   <in>
     <items>
       <include name="**/${ConfigPrefix}App.config" />
       <include name="**/${ConfigPrefix}connectionstrings.config" />
       <include name="**/${ConfigPrefix}web.config" />
     </items>
   </in>
   <do>
    <copy overwrite="true" file="${filename}" tofile="${string::replace(filename, ConfigPrefix,'')}" />
   </do>
  </foreach></target>

Il metodo "file" suggerito da @Jonathon può essere utilizzato in qualche modo con la sezione ConnectionStrings?

No, ma nulla ti impedisce di archiviare ConnectionString come chiave AppSettings.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top