A volte si ha la necessita' di avere uno o piu' settings condivisi tra i gli utenti della propria applicazione, ad esempio la stringa di connessione al DB.
Questo e' facimente ottenibile associando a tali impostazioni un custom settings provider.
Esempio:
Ho esteso i settings creati da Visual Studio aggiungendo una partial class, cosi' ho il setting disponibile direttamente dall' Intellisense usando Properties.Settings.Default.CommonDBPath.
namespace TestSettings.Properties
{
internal sealed partial class Settings
{
[ApplicationScopedSetting()]
[DefaultSettingValue("C:\\")]
[SettingsProvider(typeof(SharedSettingsFileProvider))]
public string CommonDBPath
{
get { return (string)base["CommonDBPath"]; }
set { base["CommonDBPath"] = value; }
}
}
}
Come potete notare, per questo setting ho specificato un custom provider SharedSettingsFileProvider che altro non e' che una classe che eredita da SettingsProvider.
class SharedSettingsFileProvider : SettingsProvider
{
private string mFileName;
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(this.ApplicationName, config);
mFileName = Path.Combine(Application.CommonAppDataPath, this.ApplicationName + ".config");
}
public override string ApplicationName
{
get { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; }
set { }
}
public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection)
{
SettingsPropertyValueCollection values = new SettingsPropertyValueCollection();
XmlDocument doc = new XmlDocument();
if(File.Exists(mFileName)) doc.Load(mFileName);
foreach (SettingsProperty setting in collection)
{
SettingsPropertyValue value = new SettingsPropertyValue(setting);
value.IsDirty = false;
XmlNode node=doc.SelectSingleNode("/sharedSettings/" + setting.Name);
value.SerializedValue = (node==null)? null: node.InnerText;
values.Add(value);
}
return values;
}
public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
{
XmlDocument doc = new XmlDocument();
XmlNode items=doc.AppendChild(doc.CreateElement("sharedSettings"));
foreach (SettingsPropertyValue setting in collection)
{
if (!setting.UsingDefaultValue)
{
XmlNode node = doc.CreateNode(XmlNodeType.Element, null, setting.Name, null);
node.InnerText=setting.SerializedValue.ToString();
items.AppendChild(node);
}
}
doc.Save(mFileName);
}
}
La quale salva i settings decorati con l'attributo SettingsProvider in un file xml nella cartella "AllUsers" divenendo percio' condivisi.
Applicando l'attributo a livello di classe si ottiene che tutti i settings sono memorizzati attraverso questo provider.
Ovviamente il codice va preso “As is”... ;-)