博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MonoRail学习笔记五:定制服务实现自定义功能
阅读量:6350 次
发布时间:2019-06-22

本文共 2671 字,大约阅读时间需要 8 分钟。

在上一篇
 中我提到,MonoRail中可以自定义一些服务。比如可以定义自己的Url解析类,来实现
 等
 的效果。

具体步骤如下:

1、修改web.config文件,在
monorail
节中加入以下定义

    
<
services
>
      
<
service 
id
="UrlTokenizer"
 type
="TestSiteNVelocity.CustomUrlTokenizer, TestSiteNVelocity"
 
/>
    
</
services
>

2、编写自己的
CustomUrlTokenizer

这里为了方便,我直接复制默认的
Castle.MonoRail.Framework.Services.DefaultUrlTokenizer类,将复制好的类放入TestSiteNVelocity,改名为CustomUrlTokenizer,然后在此基础上修改。
当然,这个类中有很多方法,也就可以自定义很多功能,为了实现 的效果,我们只需要修改ExtractAreaControllerAction方法。
原方法:
        
private
 
void
 ExtractAreaControllerAction(
string
 rawUrl, 
out
 
string
 area, 
out
 
string
 controller, 
out
 
string
 action)
        
{
            
string
[] parts 
=
 rawUrl.Split(
'
/
'
);
            
if
 (parts.Length 
<
 
2
)
            
{
                
throw
 
new
 UrlTokenizerException(
"
Url smaller than 2 tokens
"
);
            }
            action 
=
 parts[parts.Length 
-
 
1
];
            
int
 fileNameIndex 
=
 action.IndexOf(
'
.
'
);
            
if
 (fileNameIndex 
!=
 
-
1
)
            
{
                action 
=
 action.Substring(
0
, fileNameIndex);
            }
            controller 
=
 parts[parts.Length 
-
 
2
];
            area 
=
 
string
.Empty;
            
if
 (parts.Length 
-
 
3
 
==
 
0
)
            
{
                area 
=
 parts[parts.Length 
-
 
3
];
            }
            
else
 
if
 (parts.Length 
-
 
3
 
>
 
0
)
            
{
                StringBuilder areaSB 
=
 
new
 StringBuilder();
                
for
(
int
 i 
=
 
0
; i 
<=
 parts.Length 
-
 
3
; i
++
)
                
{
                    
if
 (parts[i] 
!=
 
null
 
&&
 parts[i].Length 
>
 
0
)
                    
{
                        areaSB.Append(parts[i]).Append(
'
/
'
);
                    }
                }
                
if
 (areaSB.Length 
>
 
0
)
                
{
                    areaSB.Length 
-=
 
1
;
                }
                area 
=
 areaSB.ToString();
            }
        }
修改后的方法:
        
private
 
void
 ExtractAreaControllerAction(
string
 rawUrl, 
out
 
string
 area, 
out
 
string
 controller, 
out
 
string
 action)
        
{
            
string[] parts = rawUrl.Split('/');
            action = parts[parts.Length - 1];
            int fileNameIndex = action.IndexOf('.');
            if (fileNameIndex != -1)
            {
                action = action.Substring(0, fileNameIndex);
            }
            if (parts.Length < 2)
            {
                controller = "servlet"; ;
                area = "";
                return;
            }
            controller 
=
 parts[parts.Length 
-
 
2
];
            area 
=
 
string
.Empty;
            
if
 (parts.Length 
-
 
3
 
==
 
0
)
            
{
                area 
=
 parts[parts.Length 
-
 
3
];
            }
            
else
 
if
 (parts.Length 
-
 
3
 
>
 
0
)
            
{
                StringBuilder areaSB 
=
 
new
 StringBuilder();
                
for
(
int
 i 
=
 
0
; i 
<=
 parts.Length 
-
 
3
; i
++
)
                
{
                    
if
 (parts[i] 
!=
 
null
 
&&
 parts[i].Length 
>
 
0
)
                    
{
                        areaSB.Append(parts[i]).Append(
'
/
'
);
                    }
                }
                
if
 (areaSB.Length 
>
 
0
)
                
{
                    areaSB.Length 
-=
 
1
;
                }
                area 
=
 areaSB.ToString();
            }
        }
红色标示的为修改部分

其实意思很简单,就是当访问
 形式的页面时,默认的controller类为ServletController类

接下来就可以按常规方式编写ServletController类和view部分


这样之后当我们访问
时,调用的就是ServletCOntroller类的Index方法,当访问
 时,调用的就是ServletCOntroller类的Bag方法 ......


当然我们也同样可以定义

    
[DefaultAction("Index")]
     public class ServletController : Controller
让所有未定义的访问调用ServletController的Index方法
这篇文章只是涉及了自定义服务的很小的一个点,我们还可以自定义:
ControllerFactory
ViewComponentFactory
ResourceFactory
EmailSender
EmailTemplateService
UrlBuilder
ValidatorRegistry

等很多服务,来实现特定效果

    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2007/10/22/932768.html,如需转载请自行联系原作者

你可能感兴趣的文章
python初学—-实现excel里面读数据进行排序
查看>>
用户体验升级后 “谁行谁上”让百度Q4财报更有底气
查看>>
直播相关学习链接
查看>>
使用RPM包工具和源码包编译安装Linux应用程序
查看>>
VoIP——开启免费通话新时代的先锋
查看>>
Linux下rsync的用法
查看>>
apache虚拟主机、日志轮询、日志统计、去版本优化
查看>>
java代码实现开启openoffice服务和关闭sffice.exe进程
查看>>
docker镜像的使用方法
查看>>
提升HTTPS安全评级
查看>>
iOS开发过程中的心得
查看>>
QOS配置命令
查看>>
linux安装搭建media-wiki
查看>>
使用 MPI for Python 并行化遗传算法
查看>>
widget
查看>>
paramiko安装及使用
查看>>
Java私塾:研磨设计模式 之 访问者模式(Visitor)
查看>>
我的友情链接
查看>>
《Python网络数据采集》读书笔记(六)
查看>>
Linux必学的60个命令
查看>>