十五、EnterpriseFrameWork框架核心类库之系统启动入口与初始化

本文详细介绍了Web、Winform及WCF三种开发模式下系统的启动入口及初始化过程,包括各自的特性、实现方式及其操作请求流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     本章内容是讲三种开发模式,web模式、Winform模式和Wcf模式的系统启动入口有什么区别,以及启动后系统初始化的内容;为什么要把这些单独提出来讲一章,因为我觉得本章非常重要,我们都知道程序中的main()函数,称之为主函数,是所有程序运行的入口;当你拿着一个程序肯定是从这个函数开始阅读,慢慢的深入了解整个程序的运行流程;而光看那些功能代码块是掌握不了系统运行时的一些机制的;

      只有掌握本章的内容后,那么在以后项目中遇到的问题基本上都能直接定位,并找到产生的原因,不然你会觉得所有产生的问题都莫名其妙,不知道从哪里下手调试;项目中的配置文件也是在系统初始化中使用的,要了解配置的值到底有什么作用也必须搞清楚系统初始化的过程,还有就是框架中的很多设计思想就是基于此处产生的,最典型的就是控制器的设计,为什么控制器要如此设计,看完后应该会深有体会;

接下来我就分别对框架中的几种模式的系统启动入口进行讲解:

1.Web版系统启动入口

2.Winform版系统启动入口

3.Wcf版系统启动入口

4.启动后初始化内容

 

源代码目录结构:

 

一、Web版系统启动入口

       Web版是三层结构程序,但跟wcf版又不一样,分为浏览器、Web服务器和数据库,所有代码都是部署在Web服务器上的,Windows下的常用web服务器就是IIS了;Net下的web系统启动入口通常都是使用Global.asax文件;是可以把初始化代码AppGlobal放在此文件中,但是框架为什么没有这么做,因为开始的设计就是在EFWWeb项目中是不能写任何cs代码的,想想看如果EFWWeb项目没有cs代码,那么就只有html代码和javascript代码,这样EFWWeb项目就不需要编译,要编译的代码都放在逻辑层项目中,我们发布就变得非常方便,只需拷贝更新逻辑层项目的dll和EFWWeb项目的aspx文件和js文件;如果只修改了界面那编译都不用了;

       那么启动入口不在Global.asax文件中那又在哪了,框架利用了httpModules来实现;先看AppGlobalHttpModule对象的代码,继承net框架中的IHttpModule接口,在实现的Init方法中通过context.BeginRequest事件调用了AppGlobal.AppStart方法实现系统初始化;

  View Code

在Web.config配置文件中需要对AppGlobalHttpModule 对象进行配置;

 

 

Web版系统就是利用httpModules来实现的,再讨论一下页面想后台控制器进行Http请求的的流程;如下图,界面javascript代码利用jquery中的Ajax功能向Web服务器发送请求,Url地址指定控制器的名称和控制器方法名称;

 

Web服务器利用httpHandlers来接收前端的所有请求,看一下APIHttpHandler的代码,继承net框架中的IHttpHandler接口,在实现接口的ProcessRequest方法中根据url中的控制器名称和方法名称,利用反射机制创建Web控制器,并执行控制器中的方法返回结果输出到页面;

  View Code

 

在Web.Config配置文件中需要对APIHttpHandler对象进行配置

 

总结一下,Web版页面调用后台控制器的过程,利用Ajax发送Http请求被APIHttpHandler对象接收,APIHttpHandler对象解析Http请求通过反射创建控制器对象并执行方法,最后讲结果用Json格式输出到页面;

 

相关资料:

关于HttpHandlers和HttpModules的不同

http://www.cnblogs.com/ricksun/articles/1545491.html

httpModules 与 httpHandlers

http://www.cnblogs.com/chenlulouis/archive/2009/12/18/1626918.html

 

二、Winform版系统启动入口

Winform版是一个两层结构的程序,客户端和服务端,服务端就是数据库,每一个客户端运行都是独立的程序运行环境,Winform版客户端就是一个Windows窗体应用程序,所以我们直接找启动项目的Program类的Main函数;

 

上面AppGlobal_Init()是通过界面FrmSplash用委托的方式调用的,这是由于系统做初始化的时候需要一定时间,为了让用户觉得程序正在运行,显示一个正在加载的界面效果比较好;我们接着看AppGlobal_Init()函数代码,这里会读配置文件中值,进行判断是Winform还是WCFClient方式,本节先说Winform方式,先执行AppGlobal.AppStart(AppGlobalType.Winform)进行系统初始化,AppGlobal对象封装了所有模式的初始化代码;

 

到此Winform版的初始化入口就讲完了,AppGlobal对象最后一节我们再看;Winform版是三种模式中相对最容易看懂的了;

 

另外再讲一下Winform版的操作请求流程,系统登录进入菜单主界面后,点击菜单按钮就会打开窗体界面,我们讲讲这个过程的实现代码。

先找到按钮的点击事件,从菜单的Tag对象获取菜单的配置信息,最后调用ShowForm(winmenu)方法;

  View Code

 

打开ShowForm()方法的代码,这段代码的意思就是找到需要打开的界面Form对象,在显示在主界面的Tab中;其中BaseController basec = ControllerCreatorFactory.ControllerCreator(menu, delegateCloseTable)是本段代码的重点,调用此方法创建控制器对象,并获取控制器包含的界面Form;

  View Code

 

接着我们将ControllerCreatorFactory创建控制器的工厂类,所以这里使用了一个工厂模型用来创建不同的控制器,包含Winform界面控制器、WcfClient界面控制器和浏览器界面控制器;我们这里先看创建Winform界面控制器的实现方法InstanceController();此方法通过菜单配置的控制器名称,利用反射机制找到控制器与控制器自定义标签定义的界面Form,这样主界面就可以显示此界面Form在Tab页中;

  View Code

 

总结一下Winform版调用控制器的过程,点击菜单按钮根据菜单的配置信息,ViewCreator对象创建对应的控制器,显示控制器自定义标签包含的界面;接着界面可以通过InvokeController方法执行控制器中的代码;

 

三、Wcf版系统启动入口

Wcf版是三层结构的程序,包括客户端、中间件和数据库,其中客户端的启动入口与上面Winform版的差不多,实现的方式一样的,用配置参数ClientType进行区分;重点讲一下中间件WCFHosting服务主机的启动入口;

查看WCFHosting程序点击启动按钮的事件代码,代码打开一个WCF的ServiceHost,绑定WCFHandlerService对象;

  View Code

 

接着查看WCFHandlerService服务对象代码,执行构造函数调用了 AppGlobal.AppStart(AppGlobalType.WCF)进行系统初始化;

  View Code

 

服务主机的启动过程就是这样,接着我们再讲一下WCF版的客户端向WCFHosting中间件请求的流程;先看客户端控制器调用Wcf服务的代码,是通过InvokeWCFService方法指定后台wcf控制器的名称和方法名;

 

接着看InvokeWCFService方法的实现代码,通过调用WCFService对象的ProcessRequest来执行WCFHandlerService服务;这段代码利用wcf服务实现了客户端和中间件之间的通讯;

  View Code

 

再接着看WCFHandlerService服务对于ProcessRequest方法的实现,通过参数传递的控制器名称和方法名称利用反射机制执行wcf控制器中的代码;

  View Code
  View Code
  View Code

 

总结一下wcf版的客户端向中间件发送请求的过程,客户端控制器利用WCFHandlerService服务通讯中间件,并发送需要执行的控制器名称和方法,中间件WCFHandlerService服务接收请求并根据参数利用反射调用wcf控制器的代码返回执行结果;

 

四、启动后初始化内容

      通过上面对系统启动入口的讲解我们知道所有模式的初始化内容都是封装在AppGlobal对象中的,初始化的类型包括四种Web、Winform、WCF、WCFClient;WCFClient类型最简单,只要创建EntLib中的缓存对象;另外三种类型内容包括:

1)EntLib中的Unity对象、Cache对象

2)定义定时任务、委托代码对象

3)配置信息,BusinessDll、IsSaas、EFWUnity

4)Web类型加载实体、web控制器、WebService服务

5)WCF类型加载实体、wcf控制器

6)Winform类型加载实体

7)初始化定时任务、委托代码和系统启动停止扩展

8)测试数据库连接

 

xueqiu.com/5405505938    

xueqiu.com/1170020985

再就是对启动的过程进行了日志记录,还有整个过程在系统中只能执行一次;

复制代码
public enum AppGlobalType

    {

        Web,Winform,WCF,WCFClient

    }
复制代码

AppGlobal对象代码

  View Code

 

五、系统启动入口与操作请求流程

 

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值