2010-07-15 13 views
8

Sto scrivendo una libreria di classi come un'astrazione da utilizzare per l'accesso a qualsiasi applicazione, servizio, ecc. Che scrivo. Lo sto rendendo decentemente robusto rendendolo molto configurabile per soddisfare le mie esigenze per la maggior parte degli scenari di registrazione di applicazioni/servizi che trovo.Applicare un app.config all'assembly DLL?

La configurazione è progettata per indicare cose come:

  • Qual è il livello di registrazione di scrivere
  • Scrivi un file di log per tutti i livelli
  • scrittura in file separati per ogni livello
  • Interruzione della registrazione (periodico, evento dell'app, dimensione in byte limitata)
  • Scadenza del file di registro (eliminare i file di registro dopo l'età del file)
  • Scrivere il testo come piatto o XML
  • Log specifica del formato di nome di file
  • Sia al prefisso del nome file con la data
  • Parent
  • nome dell'applicazione
  • ecc, ecc, ecc ...

I Ho letto alcune altre domande StackOverflow relative alle configurazioni per gli assembly DLL e causando conflitti tra l'app.config per l'assembly/app di hosting. Credo che il mio assembly abbia solo motivo di fornire un file di configurazione.

È un buon scenario per l'occasione? È forse un'idea migliore inserire la mia configurazione nel mio progetto in modo che il mio logger legga da file XML per recuperare i valori di configurazione?

+2

Dai un'occhiata alle librerie di registrazione esistenti, ad es. apaches log4net http://logging.apache.org/log4net/index.html - anche questo può essere esteso facilmente. Forse non vale la pena scrivere una libreria di registrazione completamente nuova. –

+0

@bja, grazie per il suggerimento. Ho scritto una buona quantità di codice di registrazione per un progetto al quale sto lavorando e ho deciso di utilizzare la maggior parte del codice come base per le applicazioni future. Ho provato a lavorare con un framework di registrazione in precedenza ed ero frustrato perché il mio reparto. vuole usare .Net 4.0 e ho avuto problemi nel trovare una lib o due per lavorarci. Così ho finito per implementare la mia registrazione leggera. Grazie infinite per il suggerimento, tuttavia, di solito sono d'accordo con quell'idea, ma non ci sono motivi per non riutilizzare il mio codice. – jlafay

+0

@jlafay Suggerirei comunque di guardarli - non per riutilizzare il loro codice - ma per vedere come implementano la configurazione tramite il file App.config - è molto comune che un framework di registrazione sia configurato tramite l'app. Config file, e puoi seguire la stessa pratica con il tuo framework. :-) – BrainSlugs83

risposta

8

Che cosa si potrebbe fare è

  • creare una sezione di configurazione personalizzata (utilizzando per esempiolo strumento COnfiguration Section Designer)

  • mettere configurazione del montaggio in un file separato MyAssembly.config

  • riferimento che file di assiemi di configurazione dalla configurazione della tua applicazione host:

    <configuration> 
        <configSections> 
         <section name="YourAssembly" 
           type="YourAssembly.ConfigSection, YourAssembly" /> 
        </configSections> 
    
        <YourAssembly configSource="MyAssembly.config" /> 
    </configuration> 
    

In questo modo, è possibile " esternalizza "la tua configurazione in un file di configurazione separato che hai una sola volta (nel progetto del tuo assieme), e qualsiasi progetto che ne ha bisogno ha solo bisogno di quelle impostazioni nel proprio file di configurazione.

+0

+1 per il collegamento. Ho scritto manualmente classi ConfigurationSection e ConfigurationSectionGroup per anni. Questo strumento sembra un vero toccasana! – Toby

+0

Penso che questa sia la soluzione migliore per le mie esigenze di configurazione. Grazie per il link anche al designer della sezione config! – jlafay

3

Sembra che una sezione di configurazione personalizzata funzioni bene nel tuo caso. Molte librerie, come la Enterprise Library, fanno esattamente questo. Guarda lo MSDN article sulla creazione di uno.

3

Il meccanismo di configurazione .NET non è pensato per gestire i file di configurazione per le DLL. È necessario configurare l'applicazione con le impostazioni appropriate e passarle alla classe che si sta creando dalla DLL.


È possibile aggiungere impostazioni a un progetto DLL come si farebbe di solito per le applicazioni. Tutto quello che devi fare è copiare manualmente le sezioni e le voci pertinenti nell'app.config dell'applicazione e funzionerà.

Tuttavia, è ancora vero che non è necessario copiare il file di configurazione della DLL. Non sarà letto.

+1

Dal momento che userò questo per una vasta gamma di applicazioni software, non sarebbe meglio configurarlo al volo con un file di configurazione che potrei modificare a mano velocemente piuttosto che popolare le proprietà quando istanziate un logger nel applicazione host? – jlafay

+0

@jlafay - no, quindi stai aggiungendo una dipendenza nascosta alla tua DLL. È ancora possibile creare un file di configurazione: è sufficiente che le * applicazioni * legga il file di configurazione (o una porzione di quel file copiato nelle proprie configurazioni) e trasferisca le impostazioni alle classi dalla DLL. (e +1.) –

+0

Err ..., molte DLL richiedono modifiche ai file .config (in particolare le DLL di framework di registrazione). Devi solo aggiungere le sezioni di configurazione pertinenti al tuo app.config e tutto funziona senza modifiche di codice aggiuntive. – BrainSlugs83

2

Un altro meccanismo consiste nell'avere un file di configurazione separato (* .dll.config) per l'assembly. La tecnica è mostrata qui: http://blog.rodhowarth.com/2009/07/how-to-use-appconfig-file-in-dll-plugin.html

Quanto sopra, imita la tecnica app.config standard per gli assiemi.

A mio parere, il codice di lettura della configurazione delle DLL deve esistere solo nella DLL corrispondente e in una classe separata, con la sola responsabilità di leggere le voci di configurazione da * .dll.config. Questo è un buon modo di avere un file di configurazione per un assembly in un modo simile al file di configurazione (app.config) che può avere un eseguibile.