最新标注
热门标注
历史更新
站点地图
RSS
Home
CrazyCoder
»
原创
»
it评论
»
it业界
»
互联网
»
精品软件
开发语言
»
网络编程
编程综合
嵌入式开发
算法
英文资料
汇编语言
PowerBuilder
p2p技术
验证码识别
DotNet
Java教程
C语言教程
C 教程
Delphi教程
VB教程
QQ协议开发
项目管理
»
数据库
»
Web开发
»
Python
Css教程
XML教程
网页特效
PhotoShop教程
Illustrator教程
CorelDraw教程
Ruby教程
CorelDraw教程
网站安全
开发平台-工具
Web
PHP教程
Flash教程
Ajax教程
Javascript教程
Html教程
Dreamweaver
Asp教程
技术综合
»
软件测试
办公软件
QQ相关
Windows
网络技术
游戏开发
软件工程
软件教程
编程思想
游戏开发
外挂开发
OpenApi
AutoCad
广告设计
3D设计
平面设计相关
移动手机开发
服务器
»
Linux
Unix/FreeBsd
web服务器
服务器技术
安全
博文摘选
»
翻译
首页
»
博文摘选
» Xoohoo系列(二):初始化配置、加载模块或后台服务
Rss订阅
Xoohoo系列(二):初始化配置、加载模块或后台服务
on 2011-9-21
in
博文摘选
|
0 Comment
从开发的角度讲,Global.asax文件是基于ASP.NET 应用程序的入口,而Application_Start方法正是一切的开始。 链接:IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
Xoohoo实现了一个XoohooApplication类,其继承自HttpApplication。而XoohooApplication类供Global.asax来继承。
XoohooApplication类的Application_Start方法会完成两大工作。
一、初始化配置
1、设置IoC/DI容器。我们知道,虽然MVC3提供了依赖注入的支持,但并没有一个严格意义上的DI容器,其内部创建对象是通过实现自IDependencyResolver接口的私有类DefaultDependencyResolver。具体点就是GetService和GetServices方法。GetService方法调用Activator.CreateInstance会创建对象,要求类型定义必须提供无参的构造函数,而GetServices方法只会返回一个空的迭代器Enumerable.Empty
()。 Xoohoo提供了一个间接实现自IDependencyResolver接口的UnityDependencyInjector类。通过DependencyResolver.SetResolver方法,将DefaultDependencyResolver替换为UnityDependencyInjector。 UnityDependencyInjector 采用对象适配器模式对Unity容器进行了包装 。它直接实现自Xoohoo的IDependencyInjector接口,而后者继承自IDependencyResolver。IDependencyInjector接口提供了一种在运行时(Runtime)进行映射注册的机制。当然如果您不喜欢用Unity,可以实现自己的DI容器,如AutofacDependencyInjector,Xoohoo提供了相关机制允许您做这样的替换; UnityDependencyInjector除了创建容器外,还会完成一些类型注册的工作。 2、注册FilterProvider。将Xoohoo提供的FilterRegistryFilterProvider添加到FilterProviders.Providers中。 如果想要使用基于外部配置的Filter注册解决方案,FilterRegistryFilterProvider将是一个不错的选择。 3、注册ActionInvoker。将XoohooControllerActionInvoker注册入DI容器,这里可以看作是Xoohoo为您提供了一个扩展点。Controller的ActionInvoker属性一般会返回一个ControllerActionInvoker实例,在DependencyInjectorControllerFactory中将设置Controller的ActionInvoker为XoohooControllerActionInvoker,这也正是使用DependencyInjectorControllerFactory的目的。 4、设置控制器工厂。通过ControllerBuilder.Current.SetControllerFactory方法,使用DependencyInjectorControllerFactory类替换MVC内置的DefaultControllerFactory类。 DefaultControllerFactory创建的Controller实例,将不会设置其ActionInvoker属性,所以在第一次从ActionInvoker取值时,将创建一个ControllerActionInvoker实例并返回。在DependencyInjectorControllerFactory中将其设置为XoohooControllerActionInvoker,从外部“看起来”Controller的ActionInvoker被替换了。
二、加载模块及后台服务
我们知道,想要在开机后运行某些程序,我们可以用注册表或“开始菜单->程序->启动”等方式添加要启动的程序信息。总有一种机制来保证来读取注册表或启动菜单并完成启动吧?对于Xoohoo来说,这就是引导程序。创建一个新的模块或后台服务后,在Xoohoo.config(位于站点的Configs目录,也可以自行修改配置文件名或路径)对其进行配置,引导程序负责它们的加载工作。
1、模块或后台服务配置
模块或后台服务设计完成后,将其配置在Xoohoo.config文件中。
上图是模块的配置,比如上面有名称为Core、Skinning和Logging等模块。只需要配置名称和模块,如果模块有私有配置,也加上去。
上图是后台服务的配置,比如上面有一个名称为MailMessageService的模块。除了配置名称和服务类型外,还需要加上服务执行器的类型(executorType),以及执行的时间间隔(interval)。InProcessBackgroundServiceExecutor是Xoohoo内置的服务执行器,它内部使用一个Timer来控制服务的执行。
2、引导程序
引导程序指实现了IBootStrapperTask接口的类。
模块或后台服务在Xoohoo.config配置后,在程序启动时将由引导程序来加载。 Xoohoo内置了两种引导程序,LoadModules和LoadBackgroundServices,两者的关系就像windows的注册表和启动菜单的关系。模块由LoadModules类来加载,而后台服务则由LoadBackgroundServices类来加载。
我们在DI容器中(UnityDependencyInjector)对这两个引导程序进行了注册。
Application_Start方法会调用Load方法会获取引导程序并控制其执行。
一般将具有UI界面,需要路由信息、配置ModelBinder等的插件,做成一个模块(Module)。当然,无UI的插件也可以做成模块的形式,比如日志、缓存等模块; 如果需要定时完成一些任务,比如每隔5分钟邮件报告一次服务器资源情况,就做成一个后台服务(BackgroundService)。 当然,一次行的操作也可以做成服务。
2、加载模块
模块是一个实现了IModule接口的类,接口定义如下:
LoadModules类用于加载模块,其核心方法是Execute:
moduleRegistry 对应的是模块注册器ModuleRegistry实例,用于保存已经加载的模块。这种映射关系在UnityDependencyInjector进行的,保存的是一个单例。模块注册器将在紧接着的下面介绍; routes对应的是System.Web.Mvc.RouteTable.Routes; modelBinders对应的是System.Web.Mvc.ModelBinders.Binders; moduleConfig对应的是Xoohoo.config的配置文件的反序列化结果; globalFilters对应的是System.Web.Mvc.GlobalFilters.Filters; filterRegistry对应的是Xoohoo.FilterProviders.FilterRegistry.Filters。 这些对象都是单例。
调用routes、globalFilters和filterRegistry的将其清空。 然后遍历Xoohoo.config中的模块设置,通过moduleRegistry.Load进行加载并返回Module的实例。 如果成功创建模块,则依次调用模块的Initialize、RegisterModelBinders和RegisterRoutes等方法。将路由配置注册入MVC中的路由表中,将Filter过滤器注册入MVC的GlobalFilters.Filters或FilterRegistryFilterProvider中,将模型绑定器注册入ModelBinders.Binders中。
moduleRegistry.RegisterFilters是一个扩展方法,内部调用的是Module的RegisterFilters方法。将其放在foreach外部是希望所有路由配置都加入的情况下,再注册Filter。因为Xoohoo提供了一种可以根据Route数据设置Filter的机制,避免创建Filter的时候由于Route不存在而导致失败。
3、模块注册表 (ModuleRegistry)
模块注册表用于注册(ModuleRegistry.Load方法)和保存模块引用。 ModuleRegistry.Load方法,根据Xoohoo.config模块配置中模块的类型,创建模块的实例。并将模块本身的一些私有配置(Settings)存入模块实例中。将模块实例的引用存入ModuleRegistry的内部容器中,然后返回模块的实例。
另注:ModuleRegistry.Load方法还会根据模块DataProvider的配置进行相关设置,这里暂时略去。
4、加载后台服务
后台服务是一个实现了IBackgroundService接口的类,接口定义如下:
后台服务有对应的后台服务执行器(BackgroundServiceExecutor)负责服务的调度执行。后台服务执行器指实现了IBackgroundServiceExecutor接口的类,接口定义如下:
LoadBackgroundServices类用于加载模块,其核心方法是Execute:
与模块注册表类似,backgroundServicesRegistry对应的是后台服务注册表BackgroundServiceRegistry实例,后台服务注册表并不是用于保存后台服务本身,而是用于保存已经加载的后台“后台服务执行器(BackgroundServiceExecutor)”实例的引用(执行器包含“后台服务”的引用)。BackgroundServiceRegistry的映射关系在UnityDependencyInjector进行的,保存的是一个单例; moduleConfig对应的是Xoohoo.config的配置文件的反序列化结果。
Execute方法遍历Xoohoo.config中的后台服务配置,通过backgroundServicesRegistry.Add对“后台服务执行器”进行加载并注册。接着调用对应的后台服务执行器将服务启动(Start)。
LoadBackgroundServices比较简单,具体的包括实体化后台服务及其执行器,将在接下来要介绍的BackgroundServiceRegistry类中进行。
5、后台服务注册表(BackgroundServiceRegistry)
如上所述,后台服务注册表并不是用于保存后台服务本身,而是用于加载和保存“后台服务执行器(BackgroundServiceExecutor)”,具体操作在其BackgroundServiceRegistry.Add方法中。
Add方法根据Xoohoo.config配置中“后台服务”的类型(type)以及“后台服务执行器”类型(exectorType),创建“后台服务”的实例和“后台服务执行器”的实例。并将一些私有配置(Settings)存入后台服务中。然后将“后台服务执行器”放入BackgroundServiceRegistry的内部容器中。
6、后台服务执行器(BackgroundServiceExecutor)
创建后台服务执行器时候,后台服务实例会作为参数传给其构造函数。
Xoohoo内置了一个InProcessBackgroundServiceExecutor执行器。当调用执行器的Start方法是,会完成后台服务的第一次执行,之后根据配置中的时间间隔再次执行。具体的请看InProcessBackgroundServiceExecutor类的源码。
Xoohoo中有一系列的内置模块和后台服务,以后将有专门的篇幅加以介绍。
Tags:
延伸阅读
最新评论
发表评论
昵称
评论
验证码
点击图片更换
赞助商广告
随机更新
利用Kindle+LBS,Amazon推出AmazonLocal团购服务
facebook,Facebook IPO将推迟至2012年末,以便更好留住人才
运营商智能管道,运营商智能管道业务应如何创新?
flex跳转,Flex 页面跳转 四种方法
配置文件,介绍一款好用的基于.NET的配置文件设计工具
一呼百应,一呼容易,百应能否?
万科副总裁离职,Mozilla 副总裁 Mike Shaver 即将离职
微软对开发者说:Metro才是你们的未来
vc2010,VC++2010工程中加入SplashScreen
浅析Facebook的盈利模式
甜美美女,Photoshop调出写真美女图片甜美的红褐色
雅虎ceo巴茨,雅虎CEO巴茨 错不在你
服务器测试,服务器测试过程记录(1)—平台服务器结构分析
chrome,Chrome份额首破25%大关
paypal,PayPal 展示“未来的血拼”
微软芒果正式版,微软Windows 8正式版最快一年后上市
自定义水印,asp.net上传功能(单文件,多文件,自定义生成缩略图,水印)
Poke:搜狐大战新浪?
Flex里DropDownList默认值记录
爱我的请举手,还在用Google+的请举手
火星运载火箭,这次真去火星了 NASA公布新运载火箭设计
波音787,波音787 Dreamliner娱乐系统将选择Android
甜美美女,Photoshop调出写真美女图片甜美的红褐色
iphone配件,配件厂商Case-Mate的配件图片泄露了iPhone 5的设计
inmobi,InMobi获软银2亿美元投资,欲与Google AdMob试比高
数据库数据恢复,数据"被 覆盖有假象,SQL数据库恢复终极绝招(数据恢复高级技术)
Google今日涂鸦:维生素C发现者诞辰118周年
ipad平板,iPad vs Windows 8 平板【视屏】
怎么给内存卡杀毒,给程序员的VIM速查卡
格式刷,Google Docs 终于有了格式刷,还可拖拽插入图片
热门标注
下一个互联网
(1)
家庭局域网
(1)
局域网故障诊断
(1)
我终于懂了
(1)
开始懂了伴奏
(1)
程序员的成长之路
(1)
好评还能改差评吗
(1)
给了好评还能改吗
(1)
我还能做些什么
(1)
还能做些什么
(1)
2011年度盘点
(1)
盘点我的2011
(1)
2011年盘点
(1)
2011年终盘点
(1)
互联网拓扑图
(1)
微博兴起的原因
(1)
中国互联网拓扑图
(1)
御龙在天练级攻略
(1)
微博兴起的意义
(1)
互联网矢量图
(1)
最近更新
appsync,App Zap的非常货币化策略:付费游戏的应用内购买
ios推送,60beat GamePad推iOS设备的配套游戏手柄
lost第一季,Lost Monkey:既是吃货又是莽货的孙猴子
成都万科总经理,雷锋网特约专访成都维动科技总经理吴澜
今夜有戏非你莫属,非你莫属 因为有鼠
qq2011,2011最成功的中国IT企业排行榜
2012预测,2012年中国电信市场预测和分析
小米手机开放购买,1月4日小米再次开放购买,售罄10万部需多久
check,Check-in Recipe:在菜市场每签到一次就给你发一条食谱
2011年10大,雷锋网2011年度10大Android游戏
twitter,都怪Twitter
wifi,日本自动售货机将提供免费Wi-Fi服务
凌动上网本,英特尔推新款凌动芯片,欲拯救上网本
qq2011,Gamasutra: 2011年最佳手机游戏
checkin,购物党:中国版的Price Check
Thicket:非主流的视听创作平台
如何提高网速,看C罗如何利用移动游戏提高影响力
英国首相卡梅隆,英国首相卡梅隆特制iPad应用,处理政务
Winter Wake-Up:如果下雪就提前闹醒你
K到曝欢唱版评测:给果粉K歌的SNS
最新标注
下一个互联网
(1)
家庭局域网
(1)
局域网故障诊断
(1)
我终于懂了
(1)
开始懂了伴奏
(1)
程序员的成长之路
(1)
好评还能改差评吗
(1)
给了好评还能改吗
(1)
我还能做些什么
(1)
还能做些什么
(1)
2011年度盘点
(1)
盘点我的2011
(1)
2011年盘点
(1)
2011年终盘点
(1)
互联网拓扑图
(1)
微博兴起的原因
(1)
中国互联网拓扑图
(1)
御龙在天练级攻略
(1)
微博兴起的意义
(1)
互联网矢量图
(1)
最新评论