桌面应用程序经常需要把一些配置信息存到本地,包括应用程序的配置(基于应用的全局配置)和用户(基于登陆用户的个性化配置)的配置。这里介绍一个开源的配置库项目。SettingsProvider.net是在GitHub上的一款参数配置组件,能够基于普通配置文件、ProgramData目录文件、独立存储区文件等方式的配置文件存储,它主要是基于Json格式进行的配置保存到硬盘文件里。
SettingHelper代码:
public static class SettingHelper
{
private static SettingsProvider _provider;
public static string SecretKey { get; set; }
public static string AppDataFolder { get; set; }
public static SettingsProvider Provider
{
get { return _provider ?? (_provider = CreateSettingProvider()); }
}
private static SettingsProvider CreateSettingProvider()
{
if(string.IsNullOrEmpty(AppDataFolder))
{
return new SettingsProvider(new PortableStorage("Data"),SecretKey);
}
return new SettingsProvider(new RoamingAppDataStorage(AppDataFolder), SecretKey);
}
/// <summary>
/// 保存配置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="settingsToSave"></param>
public static void Save<T>(T settingsToSave)
{
Provider.SaveSettings(settingsToSave);
}
/// <summary>
/// 按指定的文件名保存配置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="settingsToSave"></param>
/// <param name="fileName"></param>
public static void Save<T>(T settingsToSave,string fileName)
{
Provider.SaveSettings(fileName, settingsToSave);
}
/// <summary>
/// 按指定的文件名装置配置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fileName"></param>
/// <returns></returns>
public static T Load<T>(string fileName) where T : new()
{
return Provider.GetSettings<T>(fileName);
}
/// <summary>
/// 获取配置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fresh">是否刷新缓存</param>
/// <returns></returns>
public static T Load<T>(bool fresh = false) where T : new()
{
return Provider.GetSettings<T>(fresh);
}
public static T ResetToDefaults<T>() where T : new()
{
return Provider.ResetToDefaults<T>();
}
public static IEnumerable<ISettingDescriptor> ReadSettingMetadata<T>()
{
return Provider.ReadSettingMetadata<T>();
}
public static IEnumerable<ISettingDescriptor> ReadSettingMetadata(Type settingsType)
{
return Provider.ReadSettingMetadata(settingsType);
}
}
定义Application配置的文件AppContext:
public class AppContext : IAppContext
{
private AppSetting settings = new AppSetting();
private UserSetting userSetting;
private Dictionary<string, string> dictionaryResources;
private IList<string> cachedDictionaryList;
private Dictionary<string, IList<string>> viewModelcodingSettings;
private static AppContext context;
public static AppContext Context
{
get { return context ?? (context = new AppContext()); }
}
public UserProfile CurrentUser { get; set; }
public WorkingWell CurrentWell { get; set; }
定义用户配置文件类:
public class UserSetting
{
private Dictionary<string, ViewState> _viewStates;
private Dictionary<string, string> activeViews;
public Dictionary<string, string> ActiveViews
{
get
{
if(activeViews == null)
{
activeViews = new Dictionary<string, string>();
}
return activeViews;
}
set { activeViews = value; }
}
public Dictionary<string, ViewState> ViewStates
{
get
{
return _viewStates ?? new Dictionary<string,ViewState>();
}
set { _viewStates = value; }
}
public string UserId { get; set; }
/// <summary>
/// 列表导出数据保存路径
/// </summary>
public string LastExportSavedPath { get; set; }
public string LastImportPath { get; set; }
/// <summary>
/// 增加一个用户视图状态
/// </summary>
/// <param name="key"></param>
/// <param name="viewState"></param>
public void AddViewState(string key,ViewState viewState)
{
if(ViewStates.ContainsKey(key))
{
ViewStates[key] = viewState;
return;
}
ViewStates.Add(key, viewState);
}
/// <summary>
/// 获取用户视图状态对象
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public ViewState GetViewState(string key)
{
if(ViewStates.ContainsKey(key))
{
return ViewStates[key];
}
var viewState = new ViewState();
ViewStates.Add(key, viewState);
return viewState;
}
public bool ContainsKey(string key)
{
return ViewStates.ContainsKey(key);
}
}
保存用户和应用的配置信息
public static void SaveUserSetting()
{
if (AppContext.Context.CurrentUser != null && AppContext.Context.CurrentUser.UserName != null)
{
SettingHelper.Save(AppContext.Context.UserSetting, AppContext.Context.CurrentUser.UserName);
AppContext.Context.AppSetting.UserAccount = AppContext.Context.CurrentUser.UserName;
}
}
public static void SaveSettings()
{
SaveUserSetting();
SettingHelper.Save(AppContext.Context.AppSetting);
//SettingHelper.Save(AppContext.Context.DataInputRules);
}
获取用户配置信息:
private static void LoadCurrentUserSettings()
{
var userSetting = SettingHelper.Load<UserSetting>(AppContext.Context.CurrentUser.UserName);
if(userSetting.ViewStates == null)
{
userSetting = LoadDefaultUserSetting();
}
AppContext.Context.UserSetting = userSetting;
}
private static UserSetting LoadDefaultUserSetting()
{
return SettingHelper.Load<UserSetting>("defaultUser"); ;
}
程序运行之后,会在当前目录里生产配置文件。
admin文件是用户名是admin的用户的配置,appsetting文件是应用程序的配置文件,配置文件是以json的形式存储。