HTML5技术

MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码) - 懒得安分(4)

字号+ 作者:H5之家 来源:H5之家 2016-10-31 15:00 我要评论( )

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Routing; namespace Swift.MVC{ public interface IController{ void E

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Routing; namespace Swift.MVC { public interface IController { void Execute(RequestContext requestContext); } }

控制器抽象Base类的实现:(这个抽象类的作用更多在于定义一些约束、检查之类)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Swift.MVC { ControllerBase:IController { Execute(System.Web.Routing.RequestContext requestContext); } }

控制器抽象子类的实现:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Swift.MVC { Controller:ControllerBase,IDisposable { Execute(System.Web.Routing.RequestContext requestContext) { //反射得到Action方法 Type type = this.GetType(); ); System.Reflection.MethodInfo mi = type.GetMethod(actionName); //执行该Action方法 mi.Invoke( } public void Dispose() { //throw new NotImplementedException(); } } }

这里让Controller类实现IDispose接口,照应了上文控制器工厂里面的ReleaseController()方法,主要起到释放资源的作用。

3、测试及代码释疑

由于上述代码用到了System.Web.Routing里面的组件,所以,需要在测试项目里面配置路由规则,这里需要注意一点,我们上面的MvcRouteHandler就是在这里注入进去的。在测试项目里面新建一个全局配置文件如下:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Routing; using System.Web.Security; using System.Web.SessionState; namespace MyTestMVC { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { RouteTable.Routes.Add(, , , action = , id = , assembly = }), new Swift.MVC.MvcRouteHandler())); } protected void Application_BeginRequest(object sender, EventArgs e) { } } }

然后在测试项目里面模拟MVC新建一个Controllers文件夹,里面新建一个测试的控制器HomeController:

using Swift.MVC; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MyTestMVC.Controllers { public class HomeController : Controller { public void Index() { HttpContext.Current.Response.Write(); } } }

然后启动项目,访问:16792/Home/Index。运行过程以及代码释疑如下:

(1)来看看 RouteData routeData = this.RouteCollection.GetRouteData(context); 这一句

通过上图可知,this.RouteCollection里面保存的是上述全局配置文件里面添加进去的路由规则,然后调用GetRouteData(context)方法,传入当前请求的上下文,得到当前请求的RouteData对象,我们可以看到在这个RouteData对象里面,已经包含了当前请求的控制器和action的名称。

(2)监视 IRouteHandler routeHandler = routeData.RouteHandler; 

通过上图可以看到在routeData里面我们的RouteHandler已经是MvcRouteHandler对象了,还记得我们在全局配置文件里面有这样一个配置:

RouteTable.Routes.Add(, , , action = , id = , assembly = }), new Swift.MVC.MvcRouteHandler()));

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • javascript运动系列第九篇——碰撞运动 - 小火柴的蓝色理想

    javascript运动系列第九篇——碰撞运动 - 小火柴的蓝色理想

    2016-10-29 18:00

  • 深究angularJS系列 - 第二弹 - 雨夜羽翼

    深究angularJS系列 - 第二弹 - 雨夜羽翼

    2016-10-29 10:00

  • HTML5学习 - 小熊吉米

    HTML5学习 - 小熊吉米

    2016-10-28 18:01

  • MVC系列——MVC源码学习:打造自己的MVC框架(一) - 懒得安分

    MVC系列——MVC源码学习:打造自己的MVC框架(一) - 懒得安分

    2016-10-27 13:00

网友点评
t