Il posto migliore dove inserire i parametri delle nostre applicazioni è senza dubbio la sezione appSettings nel web.config.
Rispetto alla versione precedente del framework l'API per ottenere questi parametri è stata modificata, mentre quella precedente è rimasta solo per compatibilità ed è stata marcata come obsoleta, per cui verrà probabilmente eliminata nelle prossime versioni.
Versione 1.x:
System.Configuration.ConfigurationSettings.AppSettings["key1"];
Versione 2.0
System.Configuration.ConfigurationManager.AppSettings["key1"];
Utilizzando quest'approccio si ha il problema di non avere un controllo sul nome delle chiavi inserite se non a run-time.
Grazie ai BuildProvider possiamo superare questo inconveniente creando in fase di compilazione una classe che espone, come proprietà statiche, tutti i parametri contenuti in appSettings.
public class AppSettingsBuildProvider : System.Web.Compilation.BuildProvider { public override void GenerateCode(System.Web.Compilation.AssemblyBuilder assemblyBuilder) { //Cerca sul file di build il namespace ed il nome della classe da generare string nameSpace = String.Empty, className = String.Empty; using (TextReader rd = OpenReader()) { string[] line = rd.ReadLine().Split(','); nameSpace = line[0].Trim(); className = line[1].Trim(); } //Crea l'unita di compilazione CodeCompileUnit unit = new CodeCompileUnit(); //Crea il namespace CodeNamespace ns = new CodeNamespace(nameSpace); ns.Imports.Add(new CodeNamespaceImport("System")); //Crea la classe CodeTypeDeclaration classType = new CodeTypeDeclaration(className); classType.Attributes = MemberAttributes.Public|MemberAttributes.Static; //Per ogni parametro nella sezione appSettings crea una proprietà statica foreach (string key in System.Configuration.ConfigurationManager.AppSettings) { CodeMemberProperty prop = new CodeMemberProperty(); CodeSnippetExpression get = new CodeSnippetExpression("return \"" + System.Configuration.ConfigurationManager.AppSettings[key] + "\";"); prop.Type = new CodeTypeReference(typeof(string)); prop.Attributes = MemberAttributes.Public | MemberAttributes.Static; prop.Name = key; prop.GetStatements.Add(get); classType.Members.Add(prop); } //agginge namespace e classe all'unita di compilazione e compila il codice ns.Types.Add(classType); unit.Namespaces.Add(ns); assemblyBuilder.AddCodeCompileUnit(this, unit); } }
Nel file di build ci sono i dati relativi al namespace ed al nome della classe nel formato "NAMESPACE, CLASSE".
Nella pagina potremo accedere ai parametri in maniera "strong", semplicemente scrivendo:
NAMESPACE.CLASSE.KEY1
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.