惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
Help Net Security
Help Net Security
P
Proofpoint News Feed
J
Java Code Geeks
爱范儿
爱范儿
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Full Disclosure
Google DeepMind News
Google DeepMind News
H
Help Net Security
G
Google Developers Blog
Jina AI
Jina AI
Vercel News
Vercel News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
Lohrmann on Cybersecurity
S
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
Security Archives - TechRepublic
Security Archives - TechRepublic
阮一峰的网络日志
阮一峰的网络日志
N
News and Events Feed by Topic
GbyAI
GbyAI
B
Blog
O
OpenAI News
博客园_首页
Cisco Talos Blog
Cisco Talos Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News: Ask HN
Hacker News: Ask HN
TaoSecurity Blog
TaoSecurity Blog
腾讯CDC
MongoDB | Blog
MongoDB | Blog
M
MIT News - Artificial intelligence
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
Webroot Blog
Webroot Blog
Simon Willison's Weblog
Simon Willison's Weblog
Y
Y Combinator Blog
C
Cisco Blogs
A
Arctic Wolf
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
AI
AI
W
WeLiveSecurity
aimingoo的专栏
aimingoo的专栏
The Register - Security
The Register - Security
Project Zero
Project Zero
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale

博客园 - 第一控制.NET

关于winform程序的重启问题 介绍个开源框架EFMVC ETERM信息发送接收 eterm 350转443转接器 teched2008北京站 奇源网(iFeed.cn):中文版FriendFeed - 第一控制.NET - 博客园 【原创】mvc tips:建立可删节的url bug管理已经建立,测试人员进。 传说中的一次测试开始了 现在是7月26号12点13分,谷歌中国挂了。图。 mvc tips:在模板页中使用javascript - 第一控制.NET - 博客园 北京奥运官网的Flash游戏涉嫌侵权 [图]苹果iPhone SDK发布会手机游戏演示视频 在iis6里使用没有扩展名的mvc 多方消息汇总:华为又一员工跳楼?! 微软宣布:IE8将默认在真标准模式下渲染 全面遵循Web标准 [翻译]使用asp.net mvc再造一个digg 第一部分 第37位!华为成都一男性员工跳楼身亡[图] 工商银行写给中国石油的一封信
[翻译]MVC.创建你自己的IRouteHandler
第一控制.NET · 2008-02-25 · via 博客园 - 第一控制.NET

public class N2MVCRouteHandler : IRouteHandler
{
   
public IHttpHandler GetHttpHandler(RequestContext requestContext)
   
{
       N2MVCHandler handler 
= new N2MVCHandler();
       handler.RequestContext 
= requestContext;
       
return handler;
    }

}


GetHttpHandler方法返回一个IHttpHandler类型。我已经建立了一个IHttpHandler (N2MVCHandler)。N2MVCHandler继承自ASP.Net MVC Framework中封装的MvcHandler。我之所以要继承MvcHandler是因为我不想重写那些不必要的东西。在我的IHttpHandler中我重写了ProcessRequest方法,并且增加了一些代码来为当前的请求创建一个Controller。

public class N2MVCHandler : MvcHandler
{
    
protected override void ProcessRequest(IHttpContext httpContext)
    
{
       
if (this.RequestContext == null)
          
throw new InvalidOperationException("No RequestContext");

       
string controllerName = this.GetRequiredString(this.RequestContext.RouteData, "controller");

       IController controller 
= this.CreateController(controllerName);
       ControllerContext controllerContext 
= new ControllerContext(base.RequestContext, controller);

       controller.Execute(controllerContext);
    }


    
private IController CreateController(string controllerName)
    
{
       N2MVCConfigurationHandler config 
= ConfigurationManager.GetSection("Nsquared2/N2MVCSection"as N2MVCConfigurationHandler;

       IN2ControllerFactory controllerFactory 
= N2ControllerFactoryBuilder.GetControllerFactory(config.ControllerFactory);

       IController controller 
= controllerFactory.CreateController(base.RequestContext, controllerName);

       
return controller;
    }

}


ProcessRequest方法中,我用CreateController方法为为当前请求创建了一个Controller。在N2MvcHandler 类中的CreateController 方法实例化了一个在web.config中制定的ControllerFactroy。

在这个例子中,我必须用我自己的接口来代替IControllerFactory,因为我希望传递Controller的名字而不是类型。封装在MVC Framework中的MvcHandler 里的ProcessRequest 尝试在没有程序集引用(references assemblies)的情况下定位Controller 然后创建这个类型的Controller 并把他传递给IController。CreateController 方法。但是我认为应该把寻找Controller类型的工作上移到ControllerFactory 中。下面是我的IControllerFactory 接口的具体实现。

public interface IN2ControllerFactory
{
    IController CreateController(RequestContext context, 
string controllerName);
}


注意:你仍然可以创建自己的ControllerFactory,但是你必须继承我的接口来代替IControllerFactory,并且你不需要在Global.asax中的Application_Start事件中调用ControllerBuilder.Current.SetDefaultControllerFactory方法来指定你想使用哪个ControllerFactory。这些工作将在web.config中完成。你将在本文稍后看到这些实现。

我觉得在这篇文章中使用Spring.Net和ControllerFactory来创建我的Controller。

public class N2ControllerFactory : IN2ControllerFactory
{
    
public IController CreateController(RequestContext context, string
 controllerName)
    
{
        IResource input 
= new FileSystemResource(context.HttpContext.Request.MapPath("objects.xml"
));
        IObjectFactory factory 
= new
 XmlObjectFactory(input);
        IController controller 
= (IController)factory.GetObject(controllerName, typeof
(IController));

        
if (typeof
(Controller).IsAssignableFrom(controller.GetType()))
        
{
          N2MVCConfigurationHandler config 
= ConfigurationManager.GetSection("Nsquared2/N2MVCSection"as
 N2MVCConfigurationHandler;
          ((Controller)controller).ViewFactory 
=
 N2ViewFactoryBuilder.GetViewFactory(config.ViewFactory);
        }


        
return controller;
    }

}


ControllerFactory的责任是创建Controller 并填充他需要的所有信息,比如本例中的ViewFactory。

IViewFactory的作用是创建一个责任是创建一个View的factory。因为Controller 并不需要实现Controller 基类(Controller base class)所以我将在我的代码中使用一个“代码规则(code policy)”。我将检查创建出来的Controller 是否继承了Controller 类(Controller class)。如果继承了我就创建一个IViewFactory 并把他注入Controller。IController 接口没有ViewFactory 属性,这些信息我们将在Controller基类中得到。

如果我们再回过头来看一遍IHttpHandler (N2MVCHandler)中的CreateContoller 方法,我们来看看他是怎么在web.config中得到ControllerFactory 的。

private IController CreateController(string controllerName)
{
    N2MVCConfigurationHandler config 
= ConfigurationManager.GetSection("Nsquared2/N2MVCSection"as N2MVCConfigurationHandler;

    IN2ControllerFactory controllerFactory 
= N2ControllerFactoryBuilder.GetControllerFactory(config.ControllerFactory);

    IController controller 
= controllerFactory.CreateController(base.RequestContext, controllerName);

    
return controller;
}


我用了一些其他的帮助类来创建了一个Controller-的实例,并且ViewFactory在web.config中指定,帮助类里的代码跟这篇文章没什么关系。在MVC Framework公开的ctp发布以后,你可以给我写一个邮件(不是我哦,是原作者),我可以把我的代码发给你。

下面这些是我们在web.config中指定conrollerFactory 和viewFactory的地方。这样我们就可以在web.config中轻松指定自己的ControllerFactory 和ViewFactory 。

<Nsquared2>
    
<N2MVCSection
        controllerFactory
="MvcApplication.Models.N2ControllerFactory, MvcApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
        viewFactory
="MvcApplication.Models.N2ViewFactory, MvcApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</Nsquared2>


在使用Route 对象的RouteHandler时,我们可以轻松在MVC Framework中更换RouteHandler 。

RouteTable.Routes.Add(new Route
{
    Url 
= "[controller]/[action]/[id]",
    Defaults 
= new { action = "Index", id = (string)null },
    RouteHandler 
= typeof(N2MVCRouteHandler)
}
);


在这篇文章中,你应该已经学会了怎么创建你自己的IRouteHandler,和怎么用你自己的ControllerFactory 代替原有的。