Un BuildProvider per l'acceso ai parametri nel web.config

di Stefano Mostarda, in UserScript, ASP.NET 2.0, BuildProvider,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi