您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建

Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建

来源:宝玛科技网
Winform开发框架之参数配置管理功能实现-基于

SettingsProvider.net的构建

在较早时期,我写过⼀篇⽂章《》,介绍过在我的Winform框架基础上集成的参数配置模块功能,但是参数模块的配置管理感觉还不够灵活,于是⼀直在寻找⼀个较好的替代者,⽤来结合FireFoxDialog界⾯⼀并展现,期间仔细研读过好⼏篇Codeproject⽹站上的关于配置管理的⽂章,但是总是觉得不够灵活或者简便。本⽂主要针对结合FireFoxDialog参数配置界⾯组件和SettingsProvider.net技术,实现较为美观、灵活的Winform程序参数配置管理。

在CodeProject上有两三篇⽂章介绍配置⽂件的很不错,下⾯给出链接⼤家分享下:

这两个都很不错,不过感觉不太满⾜我的简单、⾼效的需求,偶然之间在GitHub上发现⼀个《》,做的⾮常不错,⽽且感觉扩展性也做的很好,因此就把它和FireFoxDialog界⾯⼀同整合,在框架内部实现参数管理功能。

1、SettingsProvider.net功能介绍

这个是在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 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 storagevar mySettings = settingsProvider.GetSettings();Assert.True(mySettings.RememberMe);

保存操作如下所⽰:

var settingsProvider = new SettingsProvider(); //By default uses IsolatedStorage for storagevar mySettings = new MySettings { Name = \"Mr Ginnivan\" };settingsProvider.Save(mySettings);

参数元数据获取操作代码如下:

var settingsProvider = new SettingsProvider();

foreach (var setting in settingsProvider.ReadSettingMetadata()){

Console.WriteLine(\"{0} ({1}) - {2}\", setting.DisplayName, setting.Description, setting.DefaultValue);}

2、参数配置功能界⾯截图

基于上述的SettingsProvider.net的组件,我们可以结合我前⾯介绍的FireFoxDialog界⾯效果,实现较好的参数配置管理功能,如下界⾯所⽰。

我们可以分别把不同的参数放到不同的存储介质⾥⾯去,如⼀些常⽤的,可以配置到本地⽬录⽂件⾥⾯去,⼀些和个⼈信息相关的内容,我

们可以把它放到数据库⾥⾯去,这样可以在各个客户端使⽤都不需要重新配置,⾮常⽅便。

上⾯的例⼦,我针对性介绍两个,⼀个是基于本地⽂件参数存储,⼀个是基于数据库⽂件的参数存储。

3、基于SettingsProvider.net的整合操作的实现

介绍了基于SettingsProvider.net的功能,以及最终整合的效果,我们来看看它具体是如何整合实现不同⽂件类型数据的保存的。

⾸先,我们在设计模式下,拖动好对应的界⾯,由于FireFoxDialog界⾯本来就是⽤来做参数设置的,因此他们⾥⾯有⼀些控件就不⼀⼀介绍了,具体可以参考对应的⽂章(http://www.codeproject.com/KB/miscctrl/ControlFirefoxDialog.aspx?msg=18549)。我们看看上述效果界⾯的设计界⾯和后台代码。

设计界⾯就是如下所⽰,拖动⼀个参数配置⽤户控件到窗体上,设置好对应的内容就可以了。后台代码如下所⽰。

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)报表模块配置管理

基于报表参数和邮件参数,我们可以定义⼀个参数对象类,⽤来⽅便保存和获取数据的承载对象。报表参数对象类如下(只做了简单的⼀个报表路径处理):

///

/// 报表设置 ///

public class ReportParameter {

///

/// 派车单报表⽂件 ///

[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\

我们看看报表组件的参数是如何初始化的:

public override void OnInit() {

ReportParameter parameter = settings.GetSettings(); 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; this.txtOtherReport.Text = reportFile; } } }

通过参数的存储对象处理,这样我们就可以通过ReportParameter 进⾏数据获取了。

保存参数的时候,同样也是先获取到⼀个参数对象,并设置它的值后,然后进⾏保存就可以了,具体代码如下所⽰。

public override bool OnApply() {

bool result = false; try {

ReportParameter parameter = settings.GetSettings(); 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 = this.txtOtherReport.Text; }

settings.SaveSettings(parameter); }

result = true; }

catch (Exception ex) {

LogTextHelper.Error(ex);

MessageDxUtil.ShowError(ex.Message); }

return result; }

2)邮件参数配置管理 邮件参数对象类如下:

///

/// 邮箱设置

///

public class EmailParameter {

///

/// 邮件账号 ///

//[DefaultValue(\"wuhuacong@163.com\")] public string Email { get; set; } ///

/// POP3服务器 ///

[DefaultValue(\"pop.163.com\")]

public string Pop3Server { get; set; } ///

/// POP3端⼝ /// [DefaultValue(110)]

public int Pop3Port { get; set; } ///

/// SMTP服务器 ///

[DefaultValue(\"smtp.163.com\")]

public string SmtpServer { get; set; } ///

/// SMTP端⼝ /// [DefaultValue(25)]

public int SmtpPort { get; set; } ///

/// 登陆账号 ///

public string LoginId { get; set; } ///

/// 登陆密码 /// [ProtectedString]

public string Password { get; set; } ///

/// 使⽤SSL加密 ///

[DefaultValue(false)]

public bool UseSSL { get; set; } }

参数显⽰和保存的界⾯设计如下所⽰。

界⾯的初始化,同样和上⾯的差不多,不过这⾥使⽤了数据库的存储类DatabaseStorage,内容将保存在数据库⾥⾯,⽽且我们通过⽤户的标识Create进⾏路径的针对性处理,可以使每个⽤户的配置⽂件不同。

public partial class PageEmail : PropertyPage {

private SettingsProvider settings; private ISettingsStorage store; public PageEmail() {

InitializeComponent();

if (!this.DesignMode) {

//DatabaseStorage:在数据库⾥⾯,以指定⽤户标识保存参数数据 string creator = Portal.gc.LoginUserInfo.Name; store = new DatabaseStorage(creator); settings = new SettingsProvider(store); } }

参数的加载代码如下所⽰,也就是把数据获取后,显⽰在界⾯上即可。

public override void OnInit() {

EmailParameter parameter = settings.GetSettings(); if (parameter != null) {

this.txtEmail.Text = parameter.Email;

this.txtLoginId.Text = parameter.LoginId;

this.txtPassword.Text = parameter.Password; this.txtPassword.Tag = parameter.Password; this.txtPop3Port.Value = parameter.Pop3Port; this.txtPop3Server.Text = parameter.Pop3Server; this.txtSmtpPort.Value = parameter.SmtpPort; this.txtSmtpServer.Text = parameter.SmtpServer; this.txtUseSSL.Checked = parameter.UseSSL; } }

数据的保存操作也很简单,和前⾯的操作差不多,如下所⽰。

EmailParameter parameter = settings.GetSettings(); if (parameter != null) {

parameter.Email = this.txtEmail.Text; parameter.LoginId = this.txtLoginId.Text;

parameter.Password = this.txtPassword.Text;

parameter.Pop3Port = Convert.ToInt32(this.txtPop3Port.Value); parameter.Pop3Server = this.txtPop3Server.Text;

parameter.SmtpPort = Convert.ToInt32(this.txtSmtpPort.Value); parameter.SmtpServer = this.txtSmtpServer.Text; parameter.UseSSL = this.txtUseSSL.Checked; settings.SaveSettings(parameter); }

最终,我们在数据库表⾥⾯,可以看到对应记录已经保存起来了,并且⽤户密码部分也进⾏了加密处理。

这样,我们整合两者的特点,就可以实现⽐较不错的参数配置界⾯的显⽰和后台存储处理了,针对性的,使⽤不同的存储介质,以满⾜不同的需要。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务