Winform开发框架之参数配置管理功能实现-基于
SettingsProvider的构建
在较早时期,我写过⼀篇⽂章《》,介绍过在我的Winform框架基础上集成的参数配置模块功能,但是参数模块的配置管理感觉还不够灵活,于是⼀直在寻⼀个较好的替代者,⽤来结合FireFoxDialog界⾯⼀并展现,期间仔细研读过好⼏篇Codeproject⽹站上的关于配置管理的⽂章,但是总是觉得不够灵活或者简便。本⽂主要针对结合FireFoxDialog参数配置界⾯组件和SettingsProvider技术,实现较为美观、灵活的Winform程序参数配置管理。
在CodeProject上有两三篇⽂章介绍配置⽂件的很不错,下⾯给出链接⼤家分享下:
这两个都很不错,不过感觉不太满⾜我的简单、⾼效的需求,偶然之间在GitHub上发现⼀个《》,做的⾮常不错,⽽且感觉扩展性也做的很好,因此就把它和FireFoxDialog界⾯⼀同整合,在框架内部实现参数管理功能。
1、SettingsProvider功能介绍
这个是在GitHub上的⼀款参数配置组件,能够基于普通配置⽂件、ProgramData⽬录⽂件、独⽴存储区⽂件等⽅式的配置⽂件存储,它主要是基于Json格式进⾏的配置保存,因此我们还可以把它存储到数据
库,虽然官⽅没有提供例⼦,但是我们很容易通过扩展实现这个功能,后⾯我介绍我对其数据库参数保存扩展类。
它还可以通过Atrribute标识进⾏管理配置⽂件,可以把参数设置为加密、默认值、修改名称等,如下是它的⼀个配置参数的类的例⼦。public class MySettings
{
[DefaultValue("Jake")]
[DisplayName("Your Name")]
public string Name { get; set; }
[DefaultValue(true)]
[Description("Should Some App Remember your name?")]
public bool RememberMe { get;set; }
public List<Guid> Favourites { get;set; }
[Key("OriginalName")]
public string Renamed { get; set; }
[ProtectedString]
public string Encrypted { get; set; }
}
读取操作如下所⽰:
var settingsProvider = new SettingsProvider(); //By default uses IsolatedStorage for storage
var mySettings = settingsProvider.GetSettings<MySettings>();
Assert.True(mySettings.RememberMe);
保存操作如下所⽰:
var settingsProvider = new SettingsProvider(); //By default uses IsolatedStorage for storage
var mySettings = new MySettings { Name = "Mr Ginnivan" };
settingsProvider.Save(mySettings);
参数元数据获取操作代码如下:
var settingsProvider = new SettingsProvider();
foreach (var setting in settingsProvider.ReadSettingMetadata<MySettings>())
{
Console.WriteLine("{0} ({1}) - {2}", setting.DisplayName, setting.Description, setting.DefaultValue);
}
2、参数配置功能界⾯截图
基于上述的SettingsProvider的组件,我们可以结合我前⾯介绍的FireFoxDialog界⾯效果,实现较好的参数配置管理功能,如下界⾯所⽰。
我们可以分别把不同的参数放到不同的存储介质⾥⾯去,如⼀些常⽤的,可以配置到本地⽬录⽂件⾥⾯去,⼀些和个⼈信息相关的内容,我
们可以把它放到数据库⾥⾯去,这样可以在各个客户端使⽤都不需要重新配置,⾮常⽅便。
上⾯的例⼦,我针对性介绍两个,⼀个是基于本地⽂件参数存储,⼀个是基于数据库⽂件的参数存储。
3、基于SettingsProvider的整合操作的实现
介绍了基于SettingsProvider的功能,以及最终整合的效果,我们来看看它具体是如何整合实现不同⽂件类型数据的保存的。
⾸先,我们在设计模式下,拖动好对应的界⾯,由于FireFoxDialog界⾯本来就是⽤来做参数设置的,因此他们⾥⾯有⼀些控件就不⼀⼀介绍了,具体可以参考对应的⽂章(deproject/KB/miscctrl/ControlFirefoxDialog.aspx?msg=1856449)。
我们看看上述效果界⾯的设计界⾯和后台代码。
设计界⾯就是如下所⽰,拖动⼀个参数配置⽤户控件到窗体上,设置好对应的内容就可以了。
后台代码如下所⽰。
public partial class FrmSettings : BaseForm
{
public FrmSettings()
{
InitializeComponent();
}
private void FrmSettings_Load(object sender, EventArgs e)
{
this.firefoxDialog1.ImageList = this.imageList1;
this.firefoxDialog1.AddPage("报表设置", new PageReport());//基于本地⽂件的参数存储
this.firefoxDialog1.AddPage("邮箱设置", new PageEmail());//基于数据库的参数存储
//下⾯是陪衬的
this.firefoxDialog1.AddPage("短信设置", new PageEmail());
this.firefoxDialog1.AddPage("声⾳设置", new PageEmail());
this.firefoxDialog1.AddPage("系统设置", new PageEmail());
this.firefoxDialog1.AddPage("备份设置", new PageEmail());
this.firefoxDialog1.AddPage("其他设置", new PageEmail());
this.firefoxDialog1.Init();
}
}
这⾥最有代表性的是PageReport和PageEmail两个组件对象。
1)报表模块配置管理
基于报表参数和邮件参数,我们可以定义⼀个参数对象类,⽤来⽅便保存和获取数据的承载对象。
报表参数对象类如下(只做了简单的⼀个报表路径处理):
///<summary>
///报表设置
///</summary>
public class ReportParameter
{
///<summary>
///派车单报表⽂件
///</summary>
[DefaultValue("WHC.CarDispatch.CarSendBill2.rdlc")]
public string CarSendReportFile { get; set; }
}
对应的设计界⾯如下所⽰,⽤来提供⼀个报表⽂件的参数配置,很简单了。
我们来看看后台的组件,对参数是如何保存和显⽰的。
⾸先需要初始化相应的对象,我们这⾥使⽤了在程序运⾏⽬录下,创建⼀个⽂件⽤来保存这些设置。
public partial class PageReport : PropertyPage
{
private SettingsProvider settings;
private ISettingsStorage store;
public PageReport()
{
InitializeComponent();
if(!this.DesignMode)
{
// PortableStorage: 在运⾏程序⽬录创建⼀个setting的⽂件记录参数数据
store = new PortableStorage();
settings = new SettingsProvider(store);
}
}
注意:PortableStorage是在运⾏程序⽬录创建⼀个setting的⽂件记录参数数据,运⾏后,最终会在⽬录下⽣成⼀个类似“ReportParameter.settings”的⽂件,它的内容格式如下所⽰。
[{"Key":"CarSendReportFile","Value":"\"WHC.CarDispatch.CarSendBill2.rdlc\""}]
我们看看报表组件的参数是如何初始化的:
public override void OnInit()
{
ReportParameter parameter = settings.GetSettings<ReportParameter>();
if (parameter != null)
{
EnableOtherReport(false);
string reportFile = parameter.CarSendReportFile;
if (reportFile == "WHC.CarDispatch.CarSendBill2.rdlc")
{
this.radReport.SelectedIndex = 0;
}
else if (reportFile == "WHC.CarDispatch.CarSendBill.rdlc")
{
this.radReport.SelectedIndex = 1;
}
else
{
EnableOtherReport(true);
this.radReport.SelectedIndex = 2;
}
}
}
通过参数的存储对象处理,这样我们就可以通过ReportParameter 进⾏数据获取了。
保存参数的时候,同样也是先获取到⼀个参数对象,并设置它的值后,然后进⾏保存就可以了,具体代码如下所⽰。
public override bool OnApply()
{
bool result = false;
try
{
ReportParameter parameter = settings.GetSettings<ReportParameter>();
if (parameter != null)
{
int otherType = 2;//2代表其他类型
if (this.radReport.SelectedIndex < otherType)
{
parameter.CarSendReportFile = this.radReport.Properties.Items[this.radReport.SelectedIndex].Value.ToString();
}
else
{
parameter.CarSendReportFile = OtherReport.Text;
}
settings.SaveSettings<ReportParameter>(parameter);
}
result = true;
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageDxUtil.ShowError(ex.Message);
}
return result;
}
2)邮件参数配置管理
邮件参数对象类如下:
///<summary>
///邮箱设置
///</summary>
public class EmailParameter
{
///<summary>
///邮件账号
///</summary>
//[DefaultValue("wuhuacong@163")]
public string Email { get; set; }
/
//<summary>
/// POP3服务器
///</summary>
[DefaultValue("pop.163")]
public string Pop3Server { get; set; }
///<summary>
/// POP3端⼝
///</summary>
[DefaultValue(110)]
public int Pop3Port { get; set; }
///<summary>
/
// SMTP服务器
///</summary>
[DefaultValue("smtp.163")]
public string SmtpServer { get; set; }
///<summary>
/// SMTP端⼝
///</summary>
[DefaultValue(25)]
public int SmtpPort { get; set; }
///<summary>
///登陆账号
/
//</summary>
public string LoginId { get; set; }
///<summary>
///登陆密码
///</summary>
[ProtectedString]
public string Password { get; set; }
///<summary>
///使⽤SSL加密
///</summary>
[DefaultValue(false)]
public bool UseSSL { get; set; }
}
参数显⽰和保存的界⾯设计如下所⽰。
界⾯的初始化,同样和上⾯的差不多,不过这⾥使⽤了数据库的存储类DatabaseStorage,内容将保存在数据库⾥⾯,⽽且我们通过⽤户的标识Create进⾏路径的针对性处理,可以使每个⽤户的配置⽂件不同。
public partial class PageEmail : PropertyPage
{
private SettingsProvider settings;
writeline方法的作用private ISettingsStorage store;
public PageEmail()
{
InitializeComponent();
if (!this.DesignMode)
{
//DatabaseStorage:在数据库⾥⾯,以指定⽤户标识保存参数数据
string creator = LoginUserInfo.Name;
store = new DatabaseStorage(creator);
settings = new SettingsProvider(store);
}
}
参数的加载代码如下所⽰,也就是把数据获取后,显⽰在界⾯上即可。
public override void OnInit()
{
EmailParameter parameter = settings.GetSettings<EmailParameter>();
if (parameter != null)
{
}
}
数据的保存操作也很简单,和前⾯的操作差不多,如下所⽰。
EmailParameter parameter = settings.GetSettings<EmailParameter>();
if (parameter != null)
{
parameter.Email = Email.Text;
parameter.LoginId = LoginId.Text;
parameter.Password = Password.Text;
parameter.Pop3Port = Convert.Pop3Port.Value);
parameter.Pop3Server = Pop3Server.Text;
parameter.SmtpPort = Convert.SmtpPort.Value);
parameter.SmtpServer = SmtpServer.Text;
parameter.UseSSL = UseSSL.Checked;
settings.SaveSettings<EmailParameter>(parameter);
}
最终,我们在数据库表⾥⾯,可以看到对应记录已经保存起来了,并且⽤户密码部分也进⾏了加密处理。
这样,我们整合两者的特点,就可以实现⽐较不错的参数配置界⾯的显⽰和后台存储处理了,针对性的,使⽤不同的存储介质,以满⾜不同的需要。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。