Condividi tramite


Introduzione alle proprietà dinamiche (Visual Studio)

Nota

L'interfaccia utente per le proprietà dinamiche è stata rimossa a partire da Visual Studio 2005. Tuttavia, le proprietà dinamiche sono ancora supportate. Se si importa un progetto da una versione precedente di Visual Studio, le impostazioni delle proprietà dinamiche verranno mantenute nel codice e funzioneranno in fase di esecuzione. È consigliabile utilizzare in alternativa Progettazione progetti per specificare le impostazioni dell'applicazione. Per ulteriori informazioni, vedere Pagina Impostazioni, Progettazione progetti e Gestione delle impostazioni di un'applicazione.

Le proprietà dinamiche consentono di configurare l'applicazione in modo tale che alcuni o tutti i valori delle proprietà vengano archiviati in un file di configurazione esterno e non nel codice compilato dell'applicazione. Fornendo agli amministratori i mezzi per aggiornare i valori delle proprietà che possono dover cambiare nel tempo, è possibile ridurre il costo totale per il mantenimento di un'applicazione dopo che questa è stata distribuita. Si supponga, ad esempio, di compilare un'applicazione in cui sia utilizzato un database di verifica durante il processo di sviluppo e che sia necessario trasformare quest'ultimo in un database di produzione al momento della distribuzione. Se si archiviano i valori delle proprietà all'interno dell'applicazione, è necessario modificare manualmente tutte le impostazioni del database prima della distribuzione, quindi ricompilare il codice sorgente. Se si archiviano questi valori esternamente, è possibile eseguire una singola modifica nel file esterno e l'applicazione consentirà di selezionare i nuovi valori alla successiva esecuzione.

Nota sulla sicurezzaNota sulla sicurezza

I valori delle proprietà archiviati in un file di configurazione non sono protetti. Non archiviare pertanto come proprietà dinamiche dati riservati, quali password e informazioni su carte di credito.

È possibile usare proprietà dinamiche in qualunque applicazione che venga compilata in un file EXE. Nei progetti che prevedono la compilazione di una DLL non è consentito utilizzare direttamente proprietà dinamiche. È tuttavia possibile impostare in modo dinamico le proprietà della DLL tramite un file EXE che fa riferimento al file DLL. Anche se le proprietà di qualunque componente, form o controllo di queste applicazioni possono essere gestite in modo dinamico, alcune proprietà sono più adatte a diventare proprietà dinamiche. Molto spesso, verranno archiviate e recuperate proprietà collegate a risorse esterne che possono cambiare, tra cui database, log eventi o contatori delle prestazioni. Molte di queste proprietà sono identificate come candidati predefiniti per le proprietà dinamiche.

Nota

Nel codice di esempio riportato in questo argomento si presuppone l'esistenza di un oggetto SqlConnection e di un file di configurazione. In assenza di tali elementi verranno restituiti errori di compilazione.

Proprietà dinamiche e file di configurazione

Quando si imposta una proprietà come configurabile, il suo valore viene scritto in un file di configurazione e viene inserito un codice nella classe per indicare che il valore della proprietà deve essere recuperato da questa risorsa esterna. Il file di configurazione varia in base al tipo di applicazione; nelle applicazioni Web viene utilizzato il file Web.config, mentre nelle applicazioni Windows viene utilizzato un file simile con estensione CONFIG. Per tutti i form e i componenti di un'applicazione viene utilizzato un singolo file di configurazione. Non è possibile selezionare un file di configurazione diverso o usare più file all'interno di una singola applicazione.

All'interno del file di configurazione, le proprietà vengono mantenute mediante XML. Si supponga, ad esempio, di aver stabilito che la proprietà ConnectionString per una connessione dati debba essere archiviata nel file di configurazione. Nell'editor del codice verrebbe visualizzato il seguente codice, con il quale si indica che il valore va archiviato esternamente:

Me.SqlConnection1.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")
        this.sqlConnection1.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString");
Nota sulla sicurezzaNota sulla sicurezza

Per ulteriori informazioni sulla creazione di connessioni dati protette, vedere Protezione delle informazioni di connessione (ADO.NET).

Nel file di configurazione, il valore di questa proprietà verrebbe archiviato tramite XML, con la chiave indicata nel codice del form:

<configuration>

<appSettings>

<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

</appSettings>

</configuration>

Ad ogni valore del file di configurazione viene assegnata una chiave usata per archiviare e recuperare il valore. Nella parte iniziale della chiave viene indicato il componente da cui è stato originato il valore. Queste due chiavi indicano, ad esempio, una proprietà ConnectionString su due diverse connessioni di dati in una singola applicazione:

<configuration>

<appSettings>

<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

<add key="sqlConnection2.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

</appSettings>

</configuration>

È possibile modificare direttamente il file di configurazione al fine di aggiornare in modo dinamico i valori della proprietà nell'applicazione. Al successivo riavvio dell'applicazione, i valori verranno aggiornati.

In un certo senso, i file di configurazione sono simili ai file di risorsa; entrambi sono usati per archiviare i valori fuori dall'applicazione compilata e per entrambi viene utilizzato XML per archiviare le informazioni. Tuttavia, i file di risorsa hanno uno scopo molto diverso da quello dei file di configurazione. I file di risorsa sono usati per archiviare le stringhe e altre risorse localizzabili a scopo di conversione, mentre i file di configurazione (nel caso di proprietà dinamiche) sono usati per aggiornare i valori delle proprietà. I valori di un file di risorsa sono generalmente destinati a essere convertiti ma non modificati, mentre i valori delle proprietà dinamiche in un file di configurazione possono essere modificati in base alle necessità. Inoltre, è possibile associare più file di risorsa a un progetto, mentre è possibile avere un solo file di configurazione per l'applicazione. Per ulteriori informazioni sui file di risorse, vedere Organizzazione gerarchica di risorse per la localizzazione.

Impostazione di più proprietà sulla stessa chiave

Più proprietà possono fare riferimento alla stessa coppia chiave/valore in un file di configurazione. Se, ad esempio, in una classe sono presenti tre componenti che accedono tutti allo stesso database, è possibile archiviare la proprietà ConnectionString di ognuno di essi nella stessa coppia chiave/valore. Di conseguenza, se il database viene modificato, è possibile aggiornare un singolo valore nel file delle impostazioni per applicare la modifica a tutti e tre i componenti. A questo scopo, impostare ogni proprietà sulla stessa chiave, come indicato di seguito:

Me.SqlConnection1.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")

Me.SqlConnection2.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")

Me.SqlConnection3.ConnectionString =
  System.Configuration.ConfigurationManager.
  AppSettings.Get("SqlConnection1.ConnectionString")
        this.sqlConnection1.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString");

        this.sqlConnection2.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString"); 

        this.sqlConnection3.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString"); 

Si noti che, sebbene diversi, tutti i componenti in uso fanno riferimento alla chiave relativa a sqlConnection1.ConnectionString.

Quando si sceglie la stessa chiave per più proprietà, nel file di configurazione viene inserita una sola voce. Il valore iniziale memorizzato è quello proveniente dalla prima proprietà cui è stata assegnata tale chiave.

Tipi di dati e proprietà dinamiche

XML consente di archiviare tutto come stringa. Se il valore della proprietà che si sta archiviando non è una stringa, verranno visualizzate ulteriori informazioni nell'editor del codice per indicare il tipo di dati relativo al valore della proprietà. Si supponga, ad esempio, di archiviare in modo dinamico il valore per le proprietà Interval e Enabled di un componente Timer. Nel file di configurazione, questa proprietà verrebbe archiviata come segue:

<appSettings>

<add key=timer1.Interval" value="100" />

<add key=timer1.Enabled" value="True" />

</appSettings>

Nell'editor di codice viene visualizzato il codice riportato di seguito per indicare che il valore recuperato deve essere modificato in Tipo di dati Double (Visual Basic):

Me.Timer1.Enabled = (New System.Configuration.
AppSettingsReader()).GetValue("timer1.Enabled", GetType(Boolean))

Me.Timer1.Interval = (New System.Configuration.
AppSettingsReader()).GetValue("Timer1.Interval", GetType(Double))
        this.timer1.Enabled = (bool)(new System.Configuration.
          AppSettingsReader().GetValue("timer1.Enabled", typeof(bool)));

        this.timer1.Interval = (System.Double)(new System.Configuration.
          AppSettingsReader().GetValue("timer1.Interval", typeof(System.Double)));

Nota

Esistono due timer, uno per Windows Form e uno per le applicazioni basate su server, con piccole differenze nei modelli di programmazione. In questo esempio viene utilizzato il timer basato su server.

Prestazioni e sicurezza con le proprietà dinamiche

Quando si utilizzano proprietà dinamiche occorre tener presenti due problemi. In primo luogo, l'archiviazione e il recupero delle proprietà dinamiche può influire in qualche modo sulle prestazioni dell'applicazione. Il recupero dei valori delle proprietà dall'applicazione compilata è leggermente più veloce rispetto al recupero dei valori delle proprietà dal file di configurazione. La prima volta che dall'applicazione si accederà a un valore del file di configurazione, si verificherà un leggero impatto sulle prestazioni nel momento in cui il file viene letto. Tuttavia, tale impatto è di scarsa importanza e non dovrebbe essere rilevante. Qualunque recupero successivo di quella o di altre proprietà ha un impatto molto inferiore sulle prestazioni, simile alla lettura di un valore da una tabella hash.

In secondo luogo, se si archiviano in un file esterno i valori delle proprietà, ad esempio ID utente e password, sarà necessario controllare chi ha accesso al file e i valori in esso contenuti. Un modo per eseguire questa operazione consiste nel proteggere il file con un elenco di controllo di accesso (ACL, Access Control List) di Windows. Un elenco di controllo di accesso consente di specificare le operazioni che i diversi utenti possono eseguire su determinati file e directory. Inoltre, se si utilizza un'applicazione Web, è possibile sfruttare l'opzione di sicurezza integrata fornita da Windows, Internet Information Services (IIS) e SQL Server. In questo modello le credenziali di autenticazione dell'utente per la rete locale sono utilizzate anche per l'accesso alle risorse del database e non viene utilizzato alcun nome utente o password esplicita nella stringa di connessione.

Per ulteriori informazioni sulla sicurezza, vedere la documentazione di Windows oppure fare riferimento alle pagine seguenti:

Vedere anche

Altre risorse

Configurazione di applicazioni mediante proprietà dinamiche