2011-01-05 21 views
6

ho i seguenti progetti:.NET .config INFERNO

  1. MVC
  2. Console applicazione
  3. libreria di classi
  4. Windows Form
  5. Biblioteca COM

Tutte queste applicazioni devono utilizzare un singolo file di configurazione. Per quanto ho capito, i file app.config sono per Windows, le applicazioni della console e le librerie di classi quando web.config è per i progetti web.

La stessa configurazione deve essere accessibile in tutti questi progetti. Ho letto che si consiglia di utilizzare il file di configurazione della macchina, ma non sarà sempre possibile accedervi, pertanto i file di configurazione devono risiedere nella nostra soluzione.

Non capisco appieno come vengono generati i file di configurazione. Attualmente ho scritto un progetto semplice in cui ho il seguente:

  1. Libreria di classi da memorizzare per servire i file di configurazione. A hanno tentato di farlo attraverso la riflessione.
  2. Applicazione Windows che dovrebbe leggere app.config da una libreria di classi.

Quando eseguo il seguente codice mi aspetto di ottenere un file di configurazione con valori di prova:

_applicationSettings = ConfigurationManager.OpenExeConfiguration(
        System.Reflection.Assembly.GetAssembly(typeof(WCSConfiguration)).Location 
        ).AppSettings;  

ciò che ho, invece, è un file di impostazioni delle applicazioni vuoto.

libreria di classi ha il seguente App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="TestTextKey" value="TestTextValue"/> 
    </appSettings> 
</configuration> 

Ho provato con .GetExecutingAssembly() metodo che mi aspetto di tornare un insieme di un codice che è attualmente in esecuzione. Questo non ha funzionato, invece ha restituito l'assembly di un'applicazione Windows.

GetAssembly(type(WCSConfiguration)) ha restituito un assembly corretto, tuttavia, il file di configurazione era mancante nella directory bin/debug.

Ho la sensazione che sto facendo qualcosa di fondamentalmente sbagliato o Microsoft non ha reso abbastanza flessibile. Ho anche provato a cercare MSDN per la spiegazione, ma questo non è stato ben documentato IMO.

Ho anche lasciato COM in grassetto perché non sono sicuro se tutti i file di configurazione siano disponibili per la libreria COM. Innanzitutto vorrei far funzionare altri progetti.

Capisco che questa è una grande quantità di informazioni. Qualsiasi aiuto sarebbe molto apprezzato. Precedentemente abbiamo scelto di utilizzare il registro, ma questo si è rivelato brutto, principalmente perché l'accesso al registro non è disponibile in alcuni scenari.Inoltre ora abbiamo più versioni delle applicazioni e il passaggio tra i rami è una mezza un lavoro di un'ora :(

Grazie

Edit:

Se aggiungo le sezioni di configurazione del DLL per app.config questo significa che queste impostazioni saranno disponibili solo da quella applicazione.Si correggono se ho torto. \ r \ n \ r \ nEsempio che ho fornito è una versione ridotta.In totale ci sono una decina di applicazioni Windows, un singolo progetto MVC e una gamma di classe librerie tutte che devono fare uso di quella configurazione

Le impostazioni di configurazione sono principalmente stringhe di connessione, valori di ricerca che non appartengono al database e poche altre impostazioni minori. La preoccupazione principale a questo punto sono le stringhe di connessione. Esistono alcune versioni minori dell'applicazione in cui ogni versione punta a un altro database.

Quello che mi piacerebbe ottenere da questo è una buona soluzione praticabile in modo che possa essere pubblicato online e altre persone che incontrano lo stesso problema non trascorreranno giorni del loro tempo.

Morale della storia IMO: Usa sia App.config e web.config per memorizzare posizione del proprio file di configurazione.

Scrivere un semplice serializzatore XML per leggere/scrivere config e DLL per servire la configurazione.

Gli oggetti COM sono una lunga storia e sono stati implementati con un "hack", poiché né App.config né Web.config sono disponibili nelle DLL COM.

+0

Hai provato a utilizzare http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.openmappedexeconfiguration.aspx per aprire qualsiasi file di configurazione arbitrario? Immagino tu abbia un file di configurazione condiviso in una posizione condivisa a cui puoi puntare. –

+0

Ho provato a usare questo. OpenMappedExeConfiguration funziona con gli eseguibili, piuttosto che con OpenMappedMachineConfiguration che pensavo potesse restituire una configurazione per una libreria di classi, ma nessuno dei due ha funzionato. –

+0

OpenMappedExeConfiguration funziona con tutti i tipi di configurazione, non capisco cosa significa che funzioni per eseguibile? Lo uso quotidianamente per aprire i file di configurazione per le mie applicazioni web –

risposta

4

Nota ConfigurationManager.OpenExeConfiguration deve essere passato il nome file del file di configurazione, non l'eseguibile.

È necessario aggiungere .config al percorso dell'eseguibile. Per ottenere l'assembly exe utilizzare Assembly.GetEntryAssembly.

Se si dispone di impostazioni di configurazione che si desidera condividere tra più parti di codice che non tutti sono nello stesso processo .NET, vorrei suggerire:

  • metterli nel proprio myStuff.config.
  • Nel codice .NET utilizzare ConfigurationManager.OpenExeConfiguration per aprire e accedere a myStuff.config.
  • Il codice non-. NET dovrà utilizzare un parser XML per caricare e leggere le impostazioni. A meno che le strutture di configurazione non siano molto complesse, questo non dovrebbe essere troppo difficile da incapsulare.
  • Inserire il percorso su myStuff.config nell'app.config di ogni applicazione che condivide questa configurazione per le applicazioni .NET. (Non applicazioni non.NET: dipende da cosa funziona per quell'applicazione.

Un altro approccio, in cui la struttura di configurazione è la stessa ma le impostazioni sono per applicazione, sarebbe una sezione di configurazione personalizzata.

+0

Darò questo andare ora. C'è un app.config in una directory bin/debug e c'è un WindowsFormApplication1.exe.config nella stessa directory. Mi aspetto di avere un ConfigurationLib.dll.config per la mia libreria di classi, ma non è lì. –

1

Un paio di punti generali: aggiungi le sezioni di configurazione della DLL nel file app.config piuttosto che fare affidamento sul file di configurazione della DLL per essere rilevato; e app.config viene effettivamente rinominato in .exe.config su build, quindi è necessario assicurarsi che un file con quel nome sia disponibile.

Inoltre, non si è costretti a utilizzare il meccanismo di caricamento di configurazione predefinito per configurare l'applicazione. È possibile creare classi di configurazione personalizzate e utilizzare semplicemente la serializzazione XML per deserializzare e configurare a piacere.

+0

Ciao. Se aggiungo le sezioni di configurazione della DLL a app.config, ciò significa che queste impostazioni saranno disponibili solo da tale applicazione. Ho ragione di dirlo? L'esempio che ho fornito è una versione ridotta. In totale ci sono una decina di applicazioni Windows, un singolo progetto MVC e una serie di librerie di classi che devono tutti fare uso di quella configurazione. –

+3

Considererei seriamente di non utilizzare il meccanismo .net predefinito e invece di creare una libreria di configurazione autonoma che possa semplicemente servire informazioni di configurazione dalle proprie classi di configurazione serializzate XML. –

+0

Detto questo, in .NET 2+ è anche possibile reindirizzare a un file di configurazione non predefinito: ad esempio, cercare ConfigurationManager.OpenMappedExeConfiguration in MSDN, che almeno per le app .NET consente di eseguire il mapping su un singolo file di configurazione. –