首先请在VS里打开下面的文件,我们将对源码分段进行说明:

步骤1:读取debug.ini文件

首先读取当前文件夹(.\Clients\Form)的debug.ini文件,该文件的args用于调试时传参,这样就不用每次都要到[Project/Properties]去设置[Commamd line argument]。在debug阶段设置debug=true;在release阶段设置debug=false,或者直接把该文件删除。如果运行.\Clients\Form\Run.exe没有带参数,传递参数就采用debug.ini文件的args。

步骤2:实例化BootStrap

    这段代码逻辑:先从授权证书读取数据,再把Key赋值给EncryptionHelper

GlobalConfiguration(位于Ligg.EasyWinApp.ImplInterface \GlobalConfiguration.cs )是Ligg.EasyWinForm项目和Ligg.EasyWinApp.Impl.xxxxCblp项目都可以访问的一个静态类。

EncryptionHelper(位于Ligg.Winform\Base\Helpers\ EncryptionHelper.cs)是一个加密解密的静态类。

 

步骤3:传参分解

传参arg[0]之间以@分隔,arg[1] 即passedCultureName表示起始的Culture,下面是对传参的解释:

//##passedArg0 format

//###formTypeStr=0multiple view      

//invisibleStr@formTypeStr=0/multipleview@startAppStr@startFuncStr   @startViewMenuIdStr@startParams@startActionsStr@passwordStr@formTitle@usrCode@usrToken  passedCultureName

//###formTypeStr=1single view

//invisibleStr@formTypeStr=1/singleviewk@startAppStr@startZoneLocStr@inputZoneVars      @startParams@startActionsStr@passwordStr@formTitle@usrCode@usrToken  passedCultureName

formTypeStr=0 表示mutiple view,指用单窗体模拟多窗体的情况;formTypeStr=1,表示single view,指单个Zone组成一个窗体(这个在以后的章节里会详细介绍)。2种情况的传参有所区别。

2种情况的公用的传参:

invisibleStr=0或为空值表示窗体可见,否则不可见。这个暂时没有实现。

startAppStr=xxxx表示开始的应用(Application)。每个应用,对应一个Ligg.EasyWinApp.Impl.xxxxCblp项目,即对应一个xxxxCblp.dll(为了方便叙述,我们暂且把它称为后台),核心业务逻辑的处理都会放在这个dll里。每个应用都对应一整套配置放在.\Applications\xxxx(application name)文件夹下

startParams:应用级别参数,用‘,‘符号相隔。既会传给前台的StartForm,也会传给后台。满足需求的各种可选性。

startActionsStr:启始动作,只传给前台,在StartForm初始化完成后,会运行 StartForm里的Act方法一次。如弹出一个提示框或运行后台的某个服务的方法等。

passwordStr:启始密码,如果应用的配置要求输入密码,该参数如果不为空值且验证通过,则不会弹出弹窗。

formTitle:StartForm的Text; 如果为空值,StartForm的Text将会去abbrevAnnexes.xml按Function/Zone的Name读取。

usrCode :启动时传递的用户登录名。登录后会存储在GlobalConfiguration.UserCode里,由前台读取显示。

usrToken:启动时传递的用户登录令牌,登录时由后台的UserServic.Logon()产生并存储在GlobalConfiguration.UserToken里。由一个应用跳转到另(同)一个应用时会带这个参数,如验证通过,就不用再弹出登录窗口。这样可实现各应用间的SSO(单点登录)。

multiple view情况下:

startFuncStr: 开始的功能(Function),就是指一个Form,一套界面。如一个应用有管理员界面和用户界面,所以有2个Function。Function的配置在 .\Application\xxxx(application)\Clients\Form\Functions\yyyy(function name)下。

startViewMenuIdStr:开始时的展示的View的菜单Id。如果为空,就会使用默认的展示View。

single view情况下:

startZoneLocStr: 开始的Zone的位置,zone会加入Public View,形成一个独立的Function。Zone的配置在 .\Application\xxxx(application)\Clients\Form\Zones\zzzz(Zone)下。

inputZoneVars: Zone级别参数,用‘,‘符号相隔。会传给前台的StartForm,在Zone 初始化时传入Zone,如果需求的可选项多的话,通过这个参数,不用定义很多Zone,只在Zone里配置选项就行了。

步骤4:设置路径,读取和设置应用启动参数

在BootStrap的SetPaths方法里,当前路径已经被设置到执行文件的祖父目录。

然后从配置文件.\Applications\xxxx(application)\ApplicationStartParamSet.xml 读取并设置ApplicationStartParamSet的各属性。

ImplementationDllPathAdapterFullClassName用于加载应用的Cblp的Dll;下面会介绍。

SupportMultiCultures是否支持多文化,如果为false的话,界面上右上角不会显示文化/语言切换的部分。所有控件的显示不会从各个Annexes.xml读取,前台界面也不用配置各个Annexes.xml。

VerifyPasswordAtStart/ShowSoftwareCoverAtStart/LogonAtStart既在ApplicationStartParamSet里配置,也可以在FunctionStartParamSet里配置,以ApplicationStartParamSet的配置为主。就是说,如果在 ApplicationStartParamSet配置为 true, FunctionStartParamSet里的配置不生效;如果在 ApplicationStartParamSet配置为false的话,可以在FunctionStartParamSet配置为true。假如每个 Function,每个Zone的配置由不同的人协作完成,在事关安全验证的配置上面,如果不必须验证,可以由参与人员根据需要来设置,如果必须验证,则总体控制。

其他属性都是起始验证的一些设置,大家可以根据软件需要来补充或扩展代码,这里不多赘述。

步骤5:设置Culture

读取配置文件.\Applications\xxxx(Aplication)\Cultures\ Cultures.xml,设置静态类CultureHelper的缺省、当前的Culture;CultureHelper位于Ligg.Winform\Base\Helpers\ CultureHelper.cs。

步骤6:验证起始密码

大家可以追踪代码,这段代码就是弹出一个对话框验证起始密码。验证规则在ApplicationStartParamSet.PasswordVerificationRule里配置。

步骤7:设置功能(Function)起始参数,作为StartForm的属性

//##set funcInitParamSet下的部分。大家可以自行查看。

步骤8:初始化应用的核心业务处理动态链接库 (CBLP.Dll)

首先bootStrap.InitGlobalConfiguration把各参数传递给GlobalConfiguration供前台后台使用。

然后CblpDllAdapter.Init初始化应用的CBLP.dll。详见上面代码,如果是调试阶段是直接实例化一个CBLP.dll的接口实施类Apdaper,这样就可以方便debug;如果是发布阶段,是加载CBLP.dll的接口实施类Adapter。

    加载CBLP.dll的接口实施类Adapter的优点:由于界面是由配置文件来决定的,所有应用共用一套启动和前台的代码,这些代码可以做到千年不变;由于基本过程控制和功能也是由配置文件来决定,所以后台cblp.dll可以只包括核心业务逻辑处理的代码,可以写的非常简单,写成函数式的就行了,如果有变动,修改后直接覆盖各cblp.dll就行了。按我多年的实施经验(不是代码经验),需求变更和多样化不大会体现在核心业务逻辑处理的代码修改,往往体现在界面/选项/流程上,这些如果可以通过配置来满足的话,那么这套框架就的价值就体现出来了。

步骤9:展示软件封面

实际上就是实例化一个single view的StartForm,这个看了后面章节的介绍就明白了。

步骤10:验证用户登录令牌和登录

为什么启动时会有用户登录令牌呢?这是由已启动的本应用或其他应用的实例通过System.Diagnostics.Process转过来的。如果前面的应用已登录,启动本应用时,用户登录令牌经过验证OK,那么就不用再登陆了,这也算实现单点登录吧。如果做成和Windows域帐号集成,只要从域的机器上启动本应用都不用登录就更完善了。

登录也是实例化一个single view的StartForm。比显示软件封面稍微复杂的地方,是它要与后台的Userservice互动 ,验证登录密码,同时把USerCode和UserToken存储到GlobalConfiguration。这些都是通过配置实现的。看了后面章节的介绍就明白了。

步骤11:实例化StartForm

最后就是用funcInitParamSet参数实例化StartForm。

    请在VS里打开下面的文件StartForm.cs

下面是代码, 首先在构造函数里把CblpDllAdapter.Adapter赋值给_Adapter,然后后台的各服务的方法全部通过各重载方法调用。

各重载方法:

请至 https://github.com/Liggin2019/Ligg.EasyWinApp/blob/master/demo/demo.rar下载,运行Form-MutiView-ITSmaoa-AdmKt2和Form-MutiView-ITSmaoa-AdmKt3相关执行文件,查看其启动的配置。

StartForm布局(Layout)的各组成元素、样式怎么配合配置文件生成和变化,请看下一章节文档。

Ligg.EasyWinApp-102-Ligg.EasyWinFormFunction--ControlBox、Tray、Resize、Menu

Ligg.EasyWinApp-101-Ligg.EasyWinForm: Application--启动,传入参数、读取Application级别配置文件、验证密码、软件封面、启动登录、StartForm的更多相关文章

  1. web调用本地exe应用程序并传入参数

    从网页中通过自定义URL Protocol调用本地程序,需要将协议写到注册表中.浏览器在解析到自定义URL Protocol之后,寻找注册表,通过注册表启动相应的程序并传入参数.协议里面需要记录本地程 ...

  2. SpringBoot启动如何加载application.yml配置文件

    一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...

  3. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  4. C#桌面程序启动时传入参数

    using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms; namespac ...

  5. Spring Boot启动命令参数详解及源码分析

    使用过Spring Boot,我们都知道通过java -jar可以快速启动Spring Boot项目.同时,也可以通过在执行jar -jar时传递参数来进行配置.本文带大家系统的了解一下Spring ...

  6. gcc向待编译源文件传入参数的方法

    gcc有两种方法向待编译源文件传入参数 第一种 利用–Dmacro=name 编译选项,详见gcc -D选项 第二种 利用链接脚本(*.lds)传入参数,类似于ADS的编译器参数可以被待编译源文件调用 ...

  7. SpringBoot多环境部署,在启动时动态设置相应的配置文件

    项目中,往往在测试环境和正式环境拥有不同的配置,例如数据库连接,第三方库的appkey等.这时候,我们就要在不同的环境启用不同的配置 下面新建三个文件,分别表示开发环境,生产环境和测试环境的配置文件 ...

  8. 【转】spring boot application.properties 配置参数详情

    multipart multipart.enabled 开启上传支持(默认:true) multipart.file-size-threshold: 大于该值的文件会被写到磁盘上 multipart. ...

  9. Selenium启动项参数设置

    再Selenium中使用不同的Webdriver可能会有不一样的方法,有些相同的操作会得到不同的结果, 本文主要介绍的是Chrome()的使用方法. 其他的Webdriver可以参考官方文档 Chro ...

随机推荐

  1. Vue组件应用

    Vue的组件是可复用的 Vue 实例,且带有一个名字 .我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用.因为组件是可复用的 Vue 实例,所以它们与 ne ...

  2. 区块链学习笔记:D02 区块链的技术发展历史和趋势

    对于区块链的技术发展历史,其实在我的印象中也就对比特币有所了解,也听过什么火币之类的玩意,但是具体是什么.怎么运作的就不清楚了... 这次的内容首先是讲解了区块链的技术演进,一张图一目了然,虽然里面涉 ...

  3. Codeforces 题解 CF863A 【Quasi-palindrome】

    此题本质上是:求一个数去掉后缀零后是否是回文串 因此,代码分为: >>> 读入 >>> 删除后缀0 >>> 判断回文 >>> 转 ...

  4. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  5. Python 3 对象关系映射(ORM)

    ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...

  6. Day 07 字符串内置方法和爬虫基础3

    目录 异常处理 LeetCode使用之两数之和(示例) 字符串内置方法 爬虫基础3 selenium基本使用 selenium模拟百度登录 selenium爬取京东商品信息 异常处理 try: pri ...

  7. 【CSS】333- 使用CSS自定义属性做一个前端加载骨架

    点击上方"前端自习课"关注,学习起来~ 我们在打开APP或者网站的时候,经常可以看到这样的效果,在内容加载完成之前,会有一个骨架动画的出现,这种加载方式比传统的进度条方式要友好的多 ...

  8. Mysql数据库优化一:集群(读写分离)之主从服务器的安装与配置

    Mysql数据库的集群(读写分离),说白了就是将读操作和写操作分开在不同的服务器上实现,以达到提高效率的目的. 大致原理如下: 数据库中的所有操作都是有日志记录的(前提是要打开这个日志记录功能) 1. ...

  9. Spring Boot 外部化配置(二) - @ConfigurationProperties 、@EnableConfigurationProperties

    目录 3.外部化配置的核心 3.2 @ConfigurationProperties 3.2.1 注册 Properties 配置类 3.2.2 绑定配置属性 3.1.3 ConfigurationP ...

  10. [ASP.NET Core 3框架揭秘] 配置[3]:配置模型总体设计

    在<读取配置数据>([上篇],[下篇])上面一节中,我们通过实例的方式演示了几种典型的配置读取方式,接下来我们从设计的维度来重写认识配置模型.配置的编程模型涉及到三个核心对象,分别通过三个 ...