对此那种混合式格局,上边说到了有二种方法,一种是例行的走访数据库情势,一种是访问WCF服务措施,而访问WCF服务,可能有按照局域网(内网)方式,也恐怕是按照互连网(外网)格局,那么大家就可能布置三种登陆方式,要是每趟须要手工修改配置文件,可能相比较辛劳,假设我们可以由此程序方法来兑现参数的界面化配置,那么工作就自在很多,也不简单失误。

《混合式开发框架》是指混合了传统《Winform开发框架》和《WCF开发框架》的表征,可以在两者之间自由切换,统一了系统界面层对事情服务的调用形式,所有组件模块均落到实处两种方法的调用,是一种弹性化相当好的框架应用,既可用来单机版软件或者根据局域网内的行使软件,也足以用来分布式技术的网络环境应用。

在大家广大程序的登陆进程中,假诺对于一些错综复杂的内容,可能都有一对陈设管理的对话框,本文介绍的混合式开发框架,是指什么吗,我上面给了一个概念。

2、配置对话框的筹划和促成

面前介绍了有关参数配置和WCF配置文件的部分相关信息,基于这一个考虑,大家应有在混合式情势的登陆界面里面,设计好相关界面,让用户可以便宜配置访问差距的数据源,以便完结真正混合式的强劲功能和便利性。

率先我们来介绍一下我的混合式框架,登陆界面的安顿性。

XML 1

单击参数设置按钮,可以进去登陆拜会参数的界面对话框,在里面可以协调直观的计划相关的WCF访问参数,界面如下所示,那其间使用了接近FireFox的界面组件,后台的公文存储,首要是依照本地的XML存储,使用了SettingsProvider.net那些组件举办多少的存储管理。

XML 2

若是是选项“单机版方式”,那么大家把相应的网络方式设置为不可选拔,那样的成效相比较好反映地点格局的排他性。

XML 3

那一个界面基本上介绍了何等处理混合式开发框架的参数配置内容了,具体的落实操作是怎么的吗?上边我们来一步步解析介绍下。

先是我们定义一个用以保存和加载参数的一个实体类,用来储存对应的参数新闻。

    /// <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);
        }

如上就是自身对此混合式开发框架的登陆格局和登陆参数举办的布署新闻保管的一个案例,希望对大家有扶助。

 

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

关于配置的管住,我肯定是率先推荐SettingsProvider.net那几个组件,大家要求精通这么些组件的运用,可以参见我的小说《Winform开发框架之参数配置管理效率落成-基于SettingsProvider.net的打造》,那里可以组合FireFoxDialog界面效果落到实处相比较协调的配备管理,界面效果如下所示。

XML 4

在WCF的安排文件中,大家可以看到许多对此IP地址的配置,而相似大家把WCF的配备音信放到一个独门的布署文件之中,方便管理。

对此局域网的WCF客户端的布置新闻,大概效果如下所示。

XML 5

而对别的网,也只是把这么些IP换成公网IP即可,一般的话,那些是单身的布局文件,大家一般还有一个主配置文件**.exe.config,用来配置大家框架常用到的一些安排音信。

一般来说所示,在大家混合式须要拜访当地数据库的时候,就足以在主配置文件之中保存主要的数据库连接音信。

XML 6

 

相关文章

网站地图xml地图