在我們很多程序的登陸過程中柳恐,如果對于一些復雜的內容却紧,可能都有一些配置管理的對話框,本文介紹的混合式開發(fā)框架胎撤,是指什么呢晓殊,我下面給了一個定義。
《混合式開發(fā)框架》是指混合了傳統(tǒng)《Winform開發(fā)框架》和《WCF開發(fā)框架》的特點伤提,可以在兩者之間自由切換巫俺,統(tǒng)一了系統(tǒng)界面層對業(yè)務服務的調用模式,所有組件模塊均實現(xiàn)兩種方式的調用肿男,是一種彈性化非常好的框架應用介汹,既可用于單機版軟件或者基于局域網(wǎng)內的應用軟件,也可以用于分布式技術的互聯(lián)網(wǎng)環(huán)境應用舶沛。
對于這種混合式模式嘹承,上面說到了有兩種方式,一種是常規(guī)的訪問數(shù)據(jù)庫方式如庭,一種是訪問WCF服務方式叹卷,而訪問WCF服務,可能有基于局域網(wǎng)(內網(wǎng))模式,也可能是基于互聯(lián)網(wǎng)(外網(wǎng))模式骤竹,那么我們就可能配置三種登陸方式帝牡,如果每次需要手工修改配置文件,可能比較麻煩蒙揣,如果我們能夠通過程序方式來實現(xiàn)參數(shù)的界面化配置靶溜,那么工作就輕松很多,也不容易出錯懒震。
1罩息、配置界面和配置內容介紹
關于配置的管理,我肯定是首先推薦SettingsProvider.net這個組件个扰,大家需要了解這個組件的使用扣汪,可以參考我的隨筆《Winform開發(fā)框架之參數(shù)配置管理功能實現(xiàn)-基于SettingsProvider.net的構建》,這里可以結合FireFoxDialog界面效果實現(xiàn)比較友好的配置管理锨匆,界面效果如下所示崭别。
在WCF的配置文件中,我們可以看到很多對于IP地址的配置恐锣,而一般我們把WCF的配置信息放到一個獨立的配置文件里面茅主,方便管理。
對于局域網(wǎng)的WCF客戶端的配置信息土榴,大概效果如下所示诀姚。
而對于外網(wǎng),也只是把這些IP換成公網(wǎng)IP即可玷禽,一般來說赫段,這些是獨立的配置文件,我們一般還有一個主配置文件**.exe.config矢赁,用來配置我們框架常用到的一些配置信息糯笙。
如下所示,在我們混合式需要訪問本地數(shù)據(jù)庫的時候撩银,就可以在主配置文件里面保存主要的數(shù)據(jù)庫連接信息给涕。
2、配置對話框的設計和實現(xiàn)
前面介紹了關于參數(shù)配置和WCF配置文件的一些相關信息额获,基于這些考慮够庙,我們應該在混合式模式的登陸界面里面,設計好相關界面抄邀,讓用戶可以方便配置訪問不同的數(shù)據(jù)源耘眨,以便實現(xiàn)真正混合式的強大功能和便利性。
首先我們來介紹一下我的混合式框架境肾,登陸界面的設計剔难。
單擊參數(shù)設置按鈕胆屿,可以進入登陸訪問參數(shù)的界面對話框,在里面可以友好直觀的配置相關的WCF訪問參數(shù)钥飞,界面如下所示,這里面使用了類似FireFox的界面組件衫嵌,后臺的文件存儲读宙,主要是基于本地的XML存儲,使用了SettingsProvider.net這個組件進行數(shù)據(jù)的存儲管理楔绞。
如果是選擇“單機版模式”结闸,那么我們把對應的網(wǎng)絡方式設置為不可選擇,這樣的效果比較好體現(xiàn)本地模式的排他性酒朵。
這些界面基本上介紹了如何處理混合式開發(fā)框架的參數(shù)配置內容了桦锄,具體的實現(xiàn)操作是如何的呢?下面我們來一步步分析介紹下蔫耽。
首先我們定義一個用來保存和加載參數(shù)的一個實體類结耀,用來存儲對應的參數(shù)信息。
/// <summary>
/// 用戶登錄的連接方式匙铡、訪問方式
/// </summary>
public class LoginParameter
{
/// <summary>
/// 系統(tǒng)最后登錄賬號
/// </summary>
[DefaultValue("admin")]
public string LoginId { get; set; }
/// <summary>
/// 登陸密碼
/// </summary>
[ProtectedString]
public string Password { get; set; }
/// <summary>
/// 記住密碼
/// </summary>
[DefaultValue(false)]
public bool RememberPassword { get; set; }
/// <summary>
/// 是否為本地數(shù)據(jù)庫連接方式图甜,否則為使用WCF服務模式(內網(wǎng),外網(wǎng))
/// </summary>
[DefaultValue(false)]
public bool IsLocalDatabase { get; set; }
/// <summary>
/// 內網(wǎng)WCF的主機地址
/// </summary>
[DefaultValue("192.168.1.10")]
public string InternalWcfHost { get; set; }
/// <summary>
/// 內網(wǎng)WCF的端口
/// </summary>
[DefaultValue(8000)]
public int InternalWcfPort { get; set; }
/// <summary>
/// 外網(wǎng)WCF的主機地址
/// </summary>
[DefaultValue("183.6.161.193")]
public string ExternalWcfHost { get; set; }
/// <summary>
/// 外網(wǎng)WCF的端口
/// </summary>
[DefaultValue(8000)]
public int ExternalWcfPort { get; set; }
}
這樣我們就可以以實體類為載體鳖眼,對數(shù)據(jù)進行獲取和保存操作了黑毅。
配置信息的加載和保存操作代碼如下所示,這些保存操作就是基于SettingsProvider.net的钦讳。
/// <summary>
/// 從本地XML文件中加載參數(shù)信息
/// </summary>
private void LoadParameter()
{
store = new PortableStorage();//保存在本地計算機
settings = new SettingsProvider(store);
parameter = settings.GetSettings<LoginParameter>();
if (parameter != null)
{
this.cmbzhanhao.Text = parameter.LoginId;
this.chkRemember.Checked = parameter.RememberPassword;
if (parameter.RememberPassword)
{
this.tbPass.Text = parameter.Password;
}
else
{
this.tbPass.Text = "";
}
this.chkLocalVersion.Checked = parameter.IsLocalDatabase;
//確保為正確的訪問方式矿瘦,網(wǎng)絡版還是單機版
SetAccessType(this.chkLocalVersion.Checked);
}
}
/// <summary>
/// 把用戶的信息保存到本地XML文件里面
/// </summary>
private void SaveParameter()
{
store = new PortableStorage();//保存在本地計算機
settings = new SettingsProvider(store);
parameter = settings.GetSettings<LoginParameter>();
if (parameter != null)
{
parameter.LoginId = this.cmbzhanhao.Text;
if (parameter.RememberPassword)
{
parameter.Password = this.tbPass.Text;
}
else
{
parameter.Password = "";
}
parameter.IsLocalDatabase = this.chkLocalVersion.Checked;
settings.SaveSettings<LoginParameter>(parameter);
}
}
對于如果選擇單機版模式,那么我們需要設置相應的參數(shù)愿卒,用來告訴混合式框架采用本地數(shù)據(jù)庫模式缚去,具體代碼如下所示。
/// <summary>
/// 單機版模式的復選框事件處理
/// </summary>
private void chkLocalVersion_CheckedChanged(object sender, EventArgs e)
{
SetAccessType(this.chkLocalVersion.Checked);
}
/// <summary>
/// 設置為網(wǎng)絡方式還是單機版模式
/// </summary>
/// <param name="localType">是否為單機版模式</param>
private void SetAccessType(bool localType)
{
this.lblNetType.Enabled = !localType;
this.radNetType.Enabled = !localType;
AppConfig config = new AppConfig();
config.AppConfigSet("CallerType", localType ? "win" : "wcf");
ConfigurationManager.RefreshSection("appSettings");
}
如果是網(wǎng)絡方式琼开,還需要區(qū)分內網(wǎng)模式病游,還是外網(wǎng)模式,根據(jù)參數(shù)來對相關的配置文件進行修改稠通,具體邏輯代碼如下所示衬衬。
/// <summary>
/// 網(wǎng)絡方式(內網(wǎng)、外網(wǎng))切換處理事件
/// </summary>
private void radNetType_SelectedIndexChanged(object sender, EventArgs e)
{
ChangeConfig();
}
/// <summary>
/// 修改配置文件
/// </summary>
private void ChangeConfig()
{
if (parameter != null)
{
bool isIntranet = radNetType.EditValue.ToString() == "內網(wǎng)";
if (isIntranet)
{
UpdateConfig(parameter.InternalWcfHost, parameter.InternalWcfPort);
}
else
{
UpdateConfig(parameter.ExternalWcfHost, parameter.ExternalWcfPort);
}
}
else
{
MessageDxUtil.ShowError("獲取參數(shù)信息失敗");
}
}
/// <summary>
/// WCF模式下改橘,修改配置文件中的主機地址信息和端口
/// </summary>
/// <param name="serverIPAddress">主機地址信息</param>
/// <param name="serverPort">端口</param>
private void UpdateConfig(string serverIPAddress, int serverPort)
{
string basePath = System.Environment.CurrentDirectory;
UpdateConfigFile(serverIPAddress, serverPort, Path.Combine(basePath, "BaseWcfConfig.config"));
UpdateConfigFile(serverIPAddress, serverPort, Path.Combine(basePath, "WcfConfig.config"));
}
/// <summary>
/// 通過正則標識方式替換其中的主機信息和端口參數(shù)
/// </summary>
/// <param name="serverIPAddress">主機地址信息</param>
/// <param name="serverPort">端口</param>
/// <param name="exeFilePath">配置文件地址</param>
private void UpdateConfigFile(string serverIPAddress, int serverPort, string exeFilePath)
{
string address = File.ReadAllText(exeFilePath, System.Text.Encoding.UTF8);
string pattern = "://.*?/";
string replacement = string.Format("://{0}:{1}/", serverIPAddress, serverPort);
address = Regex.Replace(address, pattern, replacement);
File.WriteAllText(exeFilePath, address, System.Text.Encoding.UTF8);
}
以上就是我對于混合式開發(fā)框架的登陸方式和登陸參數(shù)進行的配置信息管理的一個案例滋尉,希望對大家有幫助。