人无信不立/2008-04-26 22:30
永春阁
专注于技术,切不可沉湎于技术
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 233 文章- 20 评论- 1429
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
永春
阅读(3475)
评论(11)
编辑
收藏
网摘
所属分类:
MonoRail
发表评论
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[未注册用户]
分享学习中····
刷新评论列表
刷新页面
返回页首
发表评论
昵称:
[登录]
[注册]
主页:
邮箱:
(仅博主可见)
验证码:
看不清,换一个
评论内容:
登录
注册
[使用Ctrl+Enter键快速提交评论]
0
929150
链接:
切换模板
导航:
网站首页
社区
新闻
博问
闪存
网摘
招聘
找找看
Google搜索
China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务
相关文章:
最新IT新闻:
Twitter无处不在 魔兽世界Twitter发送器插件发布
Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新
预测:Twitter最可能收购的十家公司
网易澄清:与暴雪合资公司仅提供技术支持
杰克逊悼念仪式或成史上最大规模Web活动
相关链接:
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
我的MVP配置
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
我的最新闪存
一切随风
<
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
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
写书译书小组
创业交流
Debug 探索团队小组
博客园精华集出版小组
iBATIS.NET
MonoRail
我参与的团队
SharePoint团队(0/0)
Ajax&Atlas技术团队(0/0)
南京.net俱乐部(0/0)
ASP.NET AJAX (Atlas)学习(0/0)
MVP(微软最有价值专家)团队(0/0)
软件项目管理团队(0/0)
Debug 探索团队(0/0)
博客园精华集出版(0/0)
随笔分类
.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)
创业(2)
(rss)
企业开发(2)
(rss)
数据库(21)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
娱乐/杂记/修养(52)
(rss)
随笔档案
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月 (21)
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主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 394929
排名 - 86
最新评论
1. re: Asp.Net Forms验证(自定义、角色提供程序、单点登录)
学习ASP.NET的朋友请加QQ群:68970971 / 72308145 (Myleetle)
2. re: 换个活法
@feedback
谢谢
有道理 (永春)
3. re: 换个活法
市场+研发+培训。三人组合。先做小项目,因为大项目一般都是需要公司资质的,而目前你们的实力最好不要成立公司,要知道一个公司的开销还是蛮大的。有了稳定的客户群之后,稳定的项目以及差不多成型的产品,那就成... (feedback)
4. re: 莫名其妙的SqlServer更新错误:OleDbException 必须声明标量变量
使用参数化 DbCommand 的一个缺点是需要参数的代码将仅适用于支持相同语法的提供程序。OLEDB、SqlClient 和 Oracle 提供程序全部使用不同的语法。例如,用于命名和指定参数的 S... (弹弹)
5. re: [转载]最经典,最可怕的qq聊天记录
wuyu (1112)
阅读排行榜
1. 易经杂说—南怀瑾(9176)
2. Asp.Net Forms验证(自定义、角色提供程序、单点登录)(6712)
3. C#强化系列文章五:动态代码的使用(反射和动态生成类)(5628)
4. SQL Server2005 各版本区别(5292)
5. IBatis.Net学习笔记二--下载、编译、运行NPetShop(5169)