Alternative all'utilizzo del web.config per memorizzare le impostazioni (per soluzioni complesse)

StackOverflow https://stackoverflow.com/questions/306169

Domanda

Nelle nostre applicazioni web, abbiamo separato i nostri Livelli di Accesso ai Dati in loro propri progetti.

Questo crea alcuni problemi relativi alle impostazioni.

Perché DAL finirà devono essere consumati da forse più di un applicazione web.config non sembra un buon posto per tenere le stringhe di connessione e alcuni degli altri DAL-le relative impostazioni.

Per risolvere questo problema, su alcuni dei nostri progetti più recenti, abbiamo introdotto un terzo progetto solo per le impostazioni.Abbiamo messo l'impostazione di un sistema di .I file di impostazione...Con un semplice wrapper, la possibilità di avere diverse impostazioni per i vari ambienti (Sviluppo, QA, la messa in scena, Produzione, ecc) è facile da raggiungere.

L'unico problema è che le impostazioni di progetto (compreso il .Impostazioni di classe) viene compilato in un assieme, in modo che non si può cambiare senza fare una build/distribuzione, e alcuni dei nostri clienti vogliono essere in grado di configurare i propri progetti, senza Visual Studio.

Così, c'è una best practice per questo?Io ho quella sensazione che sono reinventare la ruota.

Alcune soluzioni come il salvataggio delle impostazioni in una directory sul server, per dire, il nostro formato XML si è verificato a noi.Ma ancora una volta, preferisco evitare di dover ri-creare la crittografia per i valori riservati e così via.E invece vorrei mantenere la soluzione di self-contained, se possibile.

EDIT: La domanda originale non conteneva davvero penetrante motivo che non siamo in grado di (credo) uso del web.config ...Che mette un paio di (molto buono) risposte al di fuori del contesto, il mio male.

È stato utile?

Soluzione

Dividerlo.Uso il fisso XML file di archiviazione soluzione per la connessione al database crittografato con .NET built-in funzioni di crittografia (non roll your own).Quindi, utilizzando la risultante di connessione al database, cercare "impostazioni tabella" nel database.In questo modo è possibile modificare le impostazioni senza ridistribuire.Se i vostri clienti hanno bisogno di essere in grado di modificare la stringa di connessione al database senza visual studio, basta compilare un piccolo Form di Windows app che è in grado di generare la stringa di connessione crittografata e risparmio la fissa XML file di archiviazione, e, se necessario, anche in grado di connettersi a DB (tramite lo stesso file) e modificare le Impostazioni tabella con le esigenze dell'utente.

Altri suggerimenti

Sistema.Di configurazione.ConfigurationManager.ConnectionStrings e di Sistema.Di configurazione.ConfigurationManager.AppSettings Contengono impostazioni di esecuzione, con applicazione quindi nel tuo DAL si possono ottenere le impostazioni memorizzate nel vostro web.file di configurazione.

Per il vostro sistema, si può creare una sezione di configurazione personalizzata che siederà nel web.config file o DAL consumatore*.file di configurazione In questi file di configurazione è possibile specificare che sono in grado di caricare da un file di configurazione del vostro disegno e la posizione.Riferimento esterno config file dal Web.Config Come:Creare Sezioni Di Configurazione Personalizzate Utilizzando ConfigurationSection

Alternativly è possibile manualy caricare i dati di configurazione DAL da qualsiasi file utilizzando ConfigurationManager.OpenExeConfiguration

È possibile aggiungere l'equivalente di un web.file di configurazione chiamato app.config che viene compilato in un file con il nome della dll o exe progetto di codice dietro.Questo è completamente reversibile senza dover ricompilare.È possibile utilizzare le impostazioni standard per le stringhe di connessione e varie impostazioni di app che possono essere definiti in una coppia chiave/valore - o con un po ' di lavoro in più, è possibile definire la configurazione personalizzato impostazioni di classe e di sezione.Si può anche riferimento impostazioni dell'app config - così si potrebbe avere 3 impostazioni memorizzate nella vostra applicazione (DEV, QA, PROD) e quindi fare riferimento solo a quello che si desidera in fase di runtime dell'applicazione.file di configurazione.Qui è un esempio di uno che è stato creato per un servizio web di impostazione.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="{Project}.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
    <section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <applicationSettings>
    <{Progetto}.Proprietà.Impostazioni>
      <setting name="{SettingName}" serializeAs="String">
        <value>{SettingValue}</value>
      </setting>
    </{Progetto}.Proprietà.Impostazioni>
  </applicationSettings>
  <microsoft.web.services3>
    <security>
      <securityTokenManager>
        <add type="Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";localName="UsernameToken" />
      </securityTokenManager>
    </security>
  </microsoft.web.services3>
</configuration>

Sembra che non si capisce come il web.config/app.config lavoro, se sto leggendo correttamente.Diciamo che hanno una struttura simile alla seguente:

DAL Progetto

Riferimenti:

  • Alcune librerie del nucleo di
  • Varie ed eventuali riferimenti

Classi:

  • DatabaseHelper
  • ObjectClass1
  • ObjectClass2
  • ecc...

Progetto Web

Riferimenti:

  • Alcune librerie del nucleo di
  • DAL Progetto
  • Varie ed eventuali riferimenti

Pagine:

  • Default.aspx
  • SomePage1.aspx
  • ecc...
  • Web.config

Nel DatabaseHelper classe, si potrebbe fare riferimento la stringa di connessione in questo modo:

string connString = ConfigurationManager
  .ConnectionStrings["myConnString"]
  .ConnectionString;

Quando questo avviene a runtime, il DatabaseHelper classe sarà in esecuzione con lo stesso dominio dell'applicazione come la tua pagina web, e quindi, tutte le chiamate a ConfigurationManager vi carico la richiesta dal web.file di configurazione fornito dal progetto web.

Pertanto, è solo bisogno di un file di configurazione del web/console/windows forms/ecc...progetto, e non è necessario preoccuparsi di avere uno in fase di progettazione in ognuno dei vostri progetti libreria di classi.

Se si esegue effettivamente DAL tuo come un servizio o un applicazione console o qualcosa del genere, allora e solo allora avete bisogno di dare il progetto DAL proprio app.config / web.file di configurazione.

Un approccio completamente diverso sarebbe utilizzare SQLite e memorizzare tutte le impostazioni dell'applicazione in là.È possibile proteggere con password il database in questione, se ciò che è importante per l'applicazione, e si può creare alcune semplici proprietà/valore di tabelle per memorizzare i dati.

Utilizzando il SQLite ADO adattatore richiederebbe solo 1 DLL aggiuntiva in progetti per accedere alle impostazioni e il DB SQLite stesso accessibile a quelle persone che non vogliono utilizzare Visual Studio.C'è anche un plugin per Firefox per interagire con il database SQLite.

È possibile memorizzare le impostazioni in qualsiasi vecchio file Xml e utilizzare l'XmlSerializer per prendere la tua classe e la sua conversione < - > da Xml.In un altro risposta Ho scritto un po ' di codice che ha fatto proprio questo.Collegato risposta serializza un elenco di oggetti semplici, ma funziona anche per serializzare un grande oggetto di configurazione.

Perché XmlSerializer serializza da/proprietà pubbliche, se non si desidera consentire la modifica di valori, potrebbe essere necessario fare la stessa classe immutabile (ghiacciolo) o di avere un letto solo la facciata che si trova davanti a una deserializzato uno.

Si tratta di un semplice trucco.Si possono impostare tramite ConfigurationManager.AppSettings[] con una propria sezione config ed esterni, riferimenti a file, o in alternativa si può semplicemente inserire una specifica nome del file xml per la configurazione di classe.

Guardate un po' Config.Net - il modo più semplice configurazione quadro .Sviluppatori NET.

Un completo, facile da usare e potente .Configurazione di rete libreria, interamente coperto con il test di unità e testato in natura su migliaia di server e applicazioni.

Si potrebbe avere un Interfaccia che mappato le impostazioni che viene utilizzato sul vostro DAL.Poi l'App si può usare Cio per alimentare le impostazioni per il DAL.

Se si utilizza una DI quadro (come Unità) è possibile specificare parametri del costruttore.Quindi, ipoteticamente, DAL tuo provider potrebbe avere un costruttore che prende la sua stringa di connessione.

So che non è possibile applicare i costruttori delle interfacce, ma è qualcosa che abbiamo a che fare con.So che il quadro di riferimento ha un paio di luoghi dove ci sono pronunciati dipendenze costruttore firme...

Guarda DslConfig.Sembra che questo risolve quello che stai cercando.

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