混合式开发框架模式中各种登陆方式的配置实现

在我们很多程序的登陆过程中,如果对于一些复杂的内容,可能都有一些配置管理的对话框,本文介绍的混合式开发框架,是指什么呢,我下面给了一个定义。

《混合式开发框架》是指混合了传统《Winform开发框架》和《WCF开发框架》的特点,可以在两者之间自由切换,统一了系统界面层对业务服务的调用模式,所有组件模块均实现两种方式的调用,是一种弹性化非常好的框架应用,既可用于单机版软件或者基于局域网内的应用软件,也可以用于分布式技术的互联网环境应用。

对于这种混合式模式,上面说到了有两种方式,一种是常规的访问数据库方式,一种是访问WCF服务方式,而访问WCF服务,可能有基于局域网(内网)模式,也可能是基于互联网(外网)模式,那么我们就可能配置三种登陆方式,如果每次需要手工修改配置文件,可能比较麻烦,如果我们能够通过程序方式来实现参数的界面化配置,那么工作就轻松很多,也不容易出错。

1、配置界面和配置内容介绍

关于配置的管理,我肯定是首先推荐SettingsProvider.net这个组件,大家需要了解这个组件的使用,可以参考我的随笔《Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建》,这里可以结合FireFoxDialog界面效果实现比较友好的配置管理,界面效果如下所示。

在WCF的配置文件中,我们可以看到很多对于IP地址的配置,而一般我们把WCF的配置信息放到一个独立的配置文件里面,方便管理。

对于局域网的WCF客户端的配置信息,大概效果如下所示。

而对于外网,也只是把这些IP换成公网IP即可,一般来说,这些是独立的配置文件,我们一般还有一个主配置文件**.exe.config,用来配置我们框架常用到的一些配置信息。

如下所示,在我们混合式需要访问本地数据库的时候,就可以在主配置文件里面保存主要的数据库连接信息。

2、配置对话框的设计和实现

前面介绍了关于参数配置和WCF配置文件的一些相关信息,基于这些考虑,我们应该在混合式模式的登陆界面里面,设计好相关界面,让用户可以方便配置访问不同的数据源,以便实现真正混合式的强大功能和便利性。

首先我们来介绍一下我的混合式框架,登陆界面的设计。

单击参数设置按钮,可以进入登陆访问参数的界面对话框,在里面可以友好直观的配置相关的WCF访问参数,界面如下所示,这里面使用了类似FireFox的界面组件,后台的文件存储,主要是基于本地的XML存储,使用了SettingsProvider.net这个组件进行数据的存储管理。

如果是选择“单机版模式”,那么我们把对应的网络方式设置为不可选择,这样的效果比较好体现本地模式的排他性。

这些界面基本上介绍了如何处理混合式开发框架的参数配置内容了,具体的实现操作是如何的呢?下面我们来一步步分析介绍下。

首先我们定义一个用来保存和加载参数的一个实体类,用来存储对应的参数信息。

    /// <summary>
    /// 用户登录的连接方式、访问方式
    /// </summary>
    public class LoginParameter
    {
        /// <summary>
        /// 系统最后登录账号
        /// </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>
        /// 是否为本地数据库连接方式,否则为使用WCF服务模式(内网,外网)
        /// </summary>
        [DefaultValue(false)]
        public bool IsLocalDatabase { get; set; }

        /// <summary>
        /// 内网WCF的主机地址
        /// </summary>
        [DefaultValue("192.168.1.10")]
        public string InternalWcfHost { get; set; }

        /// <summary>
        /// 内网WCF的端口
        /// </summary>
        [DefaultValue(8000)]
        public int InternalWcfPort { get; set; }

        /// <summary>
        /// 外网WCF的主机地址
        /// </summary>
        [DefaultValue("183.6.161.193")]
        public string ExternalWcfHost { get; set; }

        /// <summary>
        /// 外网WCF的端口
        /// </summary>
        [DefaultValue(8000)]
        public int ExternalWcfPort { get; set; }
    }

这样我们就可以以实体类为载体,对数据进行获取和保存操作了。

配置信息的加载和保存操作代码如下所示,这些保存操作就是基于SettingsProvider.net的。

        /// <summary>
        /// 从本地XML文件中加载参数信息
        /// </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;

                //确保为正确的访问方式,网络版还是单机版
                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);
            }
        }

对于如果选择单机版模式,那么我们需要设置相应的参数,用来告诉混合式框架采用本地数据库模式,具体代码如下所示。

        /// <summary>
        /// 单机版模式的复选框事件处理
        /// </summary>
        private void chkLocalVersion_CheckedChanged(object sender, EventArgs e)
        {
            SetAccessType(this.chkLocalVersion.Checked);
        }

        /// <summary>
        /// 设置为网络方式还是单机版模式
        /// </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");
        }

如果是网络方式,还需要区分内网模式,还是外网模式,根据参数来对相关的配置文件进行修改,具体逻辑代码如下所示。

        /// <summary>
        /// 网络方式(内网、外网)切换处理事件
        /// </summary>
        private void radNetType_SelectedIndexChanged(object sender, EventArgs e)
        {
            ChangeConfig();
        }

        /// <summary>
        /// 修改配置文件
        /// </summary>
        private void ChangeConfig()
        {
            if (parameter != null)
            {
                bool isIntranet = radNetType.EditValue.ToString() == "内网";
                if (isIntranet)
                {
                    UpdateConfig(parameter.InternalWcfHost, parameter.InternalWcfPort);
                }
                else
                {
                    UpdateConfig(parameter.ExternalWcfHost, parameter.ExternalWcfPort);
                }
            }
            else
            {
                MessageDxUtil.ShowError("获取参数信息失败");
            }
        }

        /// <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>
        /// 通过正则标识方式替换其中的主机信息和端口参数
        /// </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);
        }

以上就是我对于混合式开发框架的登陆方式和登陆参数进行的配置信息管理的一个案例,希望对大家有帮助。

本文转自博客园伍华聪的博客,原文链接:混合式开发框架模式中各种登陆方式的配置实现,如需转载请自行联系原博主。

时间: 2024-10-15 05:38:01

混合式开发框架模式中各种登陆方式的配置实现的相关文章

C/S模式中,登陆是怎么做的?

问题描述 C/S模式中,登陆是怎么做的?连接应该是用TCP吧登陆保持一般是怎么处理的?数据传递一般都是用自己定义的一套格式吧?别人用些抓包发包工具,是不是可以冒充已登陆的用户进行操作? 从来没做过,网上也没找到合适的资料,想了解下行情,怕做出来的东西有一大堆很低级的安全漏洞 第一次提问,积分太少,抱歉 问题补充:关于第四条我可能没描述清楚<br /><br />"别人用些抓包发包工具,是不是可以冒充已登陆的用户进行操作?"<br /><br /

数字出版业者谈FREEMIUM商业模式中的溢价方式

Freemium是由纽约最资深的http://www.aliyun.com/zixun/aggregation/17478.html">风险投资家之一Fred Wilson在2006年率先提出的一种商业模式概念.Freemium模式极大利用了"网络外部性"(network externalities),使得企业增量成本忽略不计的同时,那些愿意付费购买优质服务的用户剧增,从而为商家带来溢价利润. Freemium在 数字出版业界的应用尤其吸引各方创投人士的注意力,因为如何

.NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用

在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器无法快速处理这些并发请求,那么将会增加客户端的请求时间,严重者可能导致数据库服务或者应用服务直接瘫痪.缓存方案就是为这个而诞生,随着缓存的引入,可以把数据库的IO耗时操作,转换为内存数据的快速响应操作,或者把整个页面缓存到缓存系统里面.缓存框架在各个平台里面都有很多的实现,基本上多数是采用分布式缓存

Winform混合式开发框架访问Web API接口的处理

在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的处理方式和微信提供的接口处理规则类似,也是通过向服务器获得访问令牌(AccessToken),然后传递给每个Web API接口,实现数据的交换处理.本篇随笔主要介绍混合框架中Winform对Web API访问的处理. 1.Web API接入方式介绍 <混合式开发框架>混合了Web API接口访问.

Winform混合式开发框架的特点总结

Winform混合式开发框架,是一种支持分布式部署的应用模式,支持直接连接数据库,访问远程WCF服务,访问远程Web API服务等服务的综合性框架,根据不同的需求采用不同的数据接口,是一个适应性很广的应用框架.  混合式开发框架它本身是一个完整的业务系统外,它外围的所有辅助性模块(如通用权限.通用字典.通用附件管理.通用人员管理.通讯录管理......)均都实现了这种混合型的框架,因此使用非常方便. 1.多种数据接入方式 <混合式开发框架>混合了传统<Winform开发框架>.&l

Winform开发框架的业务对象统一调用方式

在这个纷繁的社会里面,统一性的特点能够带来很多高效的产出.牢固的记忆,这种特征无论对于企 业.个人的开发工作,知识的传承都有着非常重要的作用,Winfrom框架本身就是基于这个理念而生,从 统一的数据库设计规则开始,统一的项目格局,统一的业务类.数据访问类.实体类继承关系,再到统 一的公用类库,统一的权限管理模块,统一的字典管理模块,统一的附件管理...,理解这些理念和规则 后,再来个终极的统一,框架代码快速生成--Database2Sharp代码生成工具.所有的框架(包括传统 Winform开

如何在Word 2010中以副本方式打开Word文档

使用"以副本方式"打开Word文档可以在相同文件夹中创建一份完全相同的Word文档,在原始Word文档和副本Word文档同时打开的前提下进行编辑和修改.在Word 2010文档窗口中以副本方式打开Word文档的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"打开"按钮,如图2009120508所示. 图2009120508 单击"打开"命令 第2步,在打开的"打开"对话框中,选中

Decorator模式中遭遇继承与聚合的冲突

一:背景:Decorator *Decorator 常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator 模式中是必须的. *Decorator 定义: 动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator 模式相比用生成子类方式达到功能的扩充显得更为灵活. *为什么使用Decorator? 我们通常可以使用继承来实现功能的拓展

在Word2010中以副本方式打开Word文档

使用"以副本方式"打开Word文档可以在相同文件夹中创建一份完全相同的Word文档,在原始Word文档和副本Word文档同时打开的前提下进行编辑和修改.在Word2010文档窗口中以副本方式打开Word文档的步骤如下所述:         第1步,打开Word2010文档窗口,依次单击"文件"→"打开"按钮,如图1所示.         图1 单击"打开"命令第2步,在打开的"打开"对话框中,选中需要打开的