永春阁
专注于技术,切不可沉湎于技术
博客园
首页
博问
闪存
新随笔
联系
订阅
管理
随笔-250 文章-0 评论-1516
MonoRail学习笔记四:MonoRail基本流程分析
主要分析MonoRail框架内主要的几个类之间的调用关系,特别是分析一下当我们在浏览器中输入一个链接时,后台是怎么调用的,直至最后显示出页面的一个大体流程。
了解之后我们也可以知道哪一部分是可以由我们改造的。
基于Castle 1.0 RC3版本,和Castle 1.0稍微有点区别
首先看一下最简的一个web.config配置文件:
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
section
name
="monorail"
type
="Castle.MonoRail.Framework.Configuration.MonoRailSectionHandler, Castle.MonoRail.Framework"
/>
</
configSections
>
<
monorail
>
<
controllers
>
<
assembly
>
TestSiteNVelocity
</
assembly
>
</
controllers
>
<
viewEngines
viewPathRoot
="views"
>
<
add
type
="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity"
xhtml
="false"
/>
</
viewEngines
>
</
monorail
>
<
system
.web
>
<
httpHandlers
>
<
add
verb
="*"
path
="*.rails"
type
="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework"
/>
</
httpHandlers
>
<
httpModules
>
<
add
name
="monorail"
type
="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework"
/>
</
httpModules
>
</
system.web
>
</
configuration
>
可以看到在web.config中出现了三个类,下面我就按照程序执行的顺序来分析一下:
(以输入最简单的
http://localhost:***/home/index.rails
为例
)
首先执行
EngineContextModule
类的Init方法:
public
void
Init(HttpApplication context)
{
if
(context.Context.Error
!=
null
)
{
throw
new
Exception(
"
An exception happened on Global application or on a module that run before MonoRail's module.
"
+
"
MonoRail will not be initialized and further requests are going to fail.
"
+
"
Fix the cause of the error reported below.
"
, context.Context.Error);
}
lock
(initLock)
{
CreateAndStartContainer(context);
}
context.BeginRequest
+=
new
EventHandler(OnStartMonoRailRequest);
context.AuthorizeRequest
+=
new
EventHandler(CreateControllerAndRunStartRequestFilters);
SubscribeToApplicationHooks(context);
}
在Init方法中会读取配置文件,根据配置文件生成相应的类,
如:
XmlNodeList services = section.SelectNodes("services/service");
比如我们下面提到的
DefaultUrlTokenizer
类,当我们在web.config中配置了相应的类后,在解析Url时会使用我们自己配置的类,缺省情况下才使用
DefaultUrlTokenizer
类
然后执行
OnStartMonoRailRequest
方法:
主要是把Url等信息解析好放入
context
中,
context.Items[RailsContextKey] = newContext; 这里放入的是一个
DefaultRailsEngineContext
对象,这也是特别重要的一个对象,里面包含我们要调用的Controller类等信息。
在解析Url时默认用的是
DefaultUrlTokenizer
类,主要以下一段话:
string
[] parts
=
rawUrl.Split(
'
/
'
);
if
(parts.Length
<
2
)
{
throw
new
UrlTokenizerException(
"
Url smaller than 2 tokens
"
);
}
action
=
parts[parts.Length
-
1
];
也就是当我们输入
http://localhost:****/index.rails
时会报错,必须有两个/的情况才允许的
接下来执行
CreateControllerAndRunStartRequestFilters
方法,这个方法最主要的就是生成Controller类:
return (Controller) Activator.CreateInstance(type);
然后进入
MonoRailHttpHandlerFactory
类的
GetHandler
方法
默认情况下调用以下语句:
mrHandler = new MonoRailHttpHandler(logger);
接着再进入
MonoRailHttpHandler
类的
ProcessRequest
方法
这里首先取得处理好的context对象:
IRailsEngineContext mrContext = EngineContextModule.ObtainRailsEngineContext(context);
通过mrContext对象最终调用动态方法:
method.Invoke(this, new object[0]);
也就是执行HomeController中的index方法,执行完之后,显示页面:
private
void
ProcessView()
{
if
(controller._selectedViewName
!=
null
)
{
viewEngineManager.Process(context, controller, controller._selectedViewName);
}
}
显示页面时就会调用我们web.config中配置的
NVelocityViewEngine
类去实际输出页面
小结:
从以上分析可以看出MonoRail的设计是很灵活的,很多思想可以借鉴的,
首先Module部分可以被替换,我们可以实现自己的Module,
其次
viewEngines部分可以替换(这个很多人都知道了)
然后一些Services也可以动态替换,比如我前面提到的解析Url的类,可以用我们自己的方式解析,来实现不同的Controller和Url的映射关系。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted @ 2007-10-19 16:24
永春
阅读(4328)
评论(11)
编辑
收藏
发表评论
1508363
回复
引用
查看
#1楼
2007-10-19 23:30
Yok
EngineContextModule.Init是在HttpModule初始化时执行的,不属于一个request的流程中
回复
引用
查看
#2楼
2007-10-21 03:33
镜涛
博主可不可以给我发一份啊。谢谢啦
回复
引用
查看
#3楼
[
楼主
]
2007-10-22 08:44
GSpring
@Yok
对,Init方法的确不属于一个request的流程中
只不过比较重要,我就写在这边了-_-
回复
引用
查看
#4楼
[
楼主
]
2007-10-22 08:44
GSpring
@镜涛
发给你什么?MonoRail的源码?
回复
引用
#5楼
2007-11-28 16:51
BoonChu[未注册用户]
如果用BOBO就不是这个Moudle了
回复
引用
#6楼
2007-12-03 13:17
且歌[未注册用户]
能否修改DefaultUrlTokenizer让monorail支持views根目录的功能页面呢?
现在根目录下只能放文件夹
回复
引用
查看
#7楼
[
楼主
]
2007-12-03 13:41
GSpring
@且歌
可以参见我的:
MonoRail学习笔记五:定制服务实现自定义功能
回复
引用
#8楼
2008-08-21 17:53
chenquan[未注册用户]
学习中
谢谢分享```
回复
引用
#9楼
2009-04-21 09:23
springsky[未注册用户]
分享学习中····
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
美国空军拟最多购买1.8万台iPad 2
·
伊朗封杀Gmail和Facebook等互联网服务
·
分析称专利之争让谷歌苹果两败俱伤
·
Android平台发现新型手机病毒Rootsmart
·
HTC首款Android4.0手机大曝光
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
本公司专注于音视频、图形图像编码转换等相关开发,承接各种相关项目。(gaochun@zhisoft.com)
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
昵称:
永春
园龄:
5年7个月
粉丝:
66
关注:
3
<
2007年10月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
.Net(50)
(rss)
AJax(3)
(rss)
C++/VC学习(2)
(rss)
iBATIS.NET(15)
(rss)
Java(6)
(rss)
MonoRail(25)
(rss)
OS Shell(5)
(rss)
SharePoint(42)
(rss)
Windows Server(1)
(rss)
XHTML/CSS/Script(6)
(rss)
创业(3)
(rss)
企业开发(2)
(rss)
数据库(21)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
音视频、图形相关开发
(rss)
娱乐/杂记/修养(54)
(rss)
随笔档案
2010年4月 (1)
2010年3月 (1)
2010年2月 (2)
2009年4月 (1)
2009年2月 (2)
2009年1月 (1)
2008年11月 (1)
2008年10月 (1)
2008年9月 (1)
2008年8月 (3)
2008年7月 (7)
2008年6月 (1)
2008年5月 (2)
2008年4月 (12)
2008年3月 (14)
2008年2月 (3)
2008年1月 (14)
2007年12月 (17)
2007年11月 (20)
2007年10月 (31)
2007年9月 (13)
2007年8月 (25)
2007年7月 (10)
2007年6月 (1)
2007年5月 (2)
2007年4月 (10)
2007年3月 (15)
2007年2月 (7)
2007年1月 (1)
2006年12月 (3)
2006年11月 (21)
2006年10月 (5)
2006年8月 (2)
SharePoint学习
Codeplex Sharepoint
jianyi @ cnblogs
Kaneboy's Blog
Patrick Tisseghem's Blog
管理相关
下载_中计在线
中国管理之家
开源社区
C#开源资源大全
Java开源大全
SourceForge主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 577931
排名 - 89
最新评论
阅读排行榜