混合式開發(fā)框架模式中各種登陸方式的配置實現(xiàn)

在我們很多程序的登陸過程中柳恐,如果對于一些復雜的內容却紧,可能都有一些配置管理的對話框,本文介紹的混合式開發(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ù)進行的配置信息管理的一個案例滋尉,希望對大家有幫助。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末飞主,一起剝皮案震驚了整個濱河市狮惜,隨后出現(xiàn)的幾起案子高诺,更是在濱河造成了極大的恐慌,老刑警劉巖碾篡,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虱而,死亡現(xiàn)場離奇詭異,居然都是意外死亡开泽,警方通過查閱死者的電腦和手機牡拇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆律,“玉大人惠呼,你說我怎么就攤上這事÷驮牛” “怎么了剔蹋?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辅髓。 經(jīng)常有香客問我泣崩,道長,這世上最難降的妖魔是什么洛口? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任律想,我火速辦了婚禮,結果婚禮上绍弟,老公的妹妹穿的比我還像新娘技即。我一直安慰自己,他們只是感情好樟遣,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布而叼。 她就那樣靜靜地躺著,像睡著了一般豹悬。 火紅的嫁衣襯著肌膚如雪葵陵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天瞻佛,我揣著相機與錄音脱篙,去河邊找鬼。 笑死伤柄,一個胖子當著我的面吹牛绊困,可吹牛的內容都是我干的。 我是一名探鬼主播适刀,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼秤朗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笔喉?” 一聲冷哼從身側響起取视,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤硝皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后作谭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽物,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年折欠,在試婚紗的時候發(fā)現(xiàn)自己被綠了贝或。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡怨酝,死狀恐怖傀缩,靈堂內的尸體忽然破棺而出那先,到底是詐尸還是另有隱情农猬,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布售淡,位于F島的核電站斤葱,受9級特大地震影響,放射性物質發(fā)生泄漏揖闸。R本人自食惡果不足惜揍堕,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汤纸。 院中可真熱鬧衩茸,春花似錦、人聲如沸贮泞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啃擦。三九已至囊蓝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間令蛉,已是汗流浹背聚霜。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留珠叔,地道東北人蝎宇。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像祷安,于是被迫代替她去往敵國和親夫啊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容