.NET/ASP.NET MVC(模块化开发AraeRegistration)

阅读目录:

  • 1.开篇介绍
  • 2.AreaRegistration注册路由(传递路由上下文进行模块化注册)

1】开篇介绍

ASP.NET Routing 路由功能非常强大,设计的也很巧妙;如果说ASP.NETMVC是建立在ASP.NET之上还不如准确的说ASP.NETMVC是建立在Routing基础之上的,才使得Controller顺利被找到并且执行Action;

那么今天这篇文章是一个简短的介绍如何在ASP.NETMVC下进行很好的模块化开发,都知道ASP.NETMVC是分层架构中的UI层框架;而UI层的开发有着天生的难以控制性,尤其是WEBUI和WINFORMUI有着很大的区别;WEBUI的组成元素多,又是在远程的浏览器中处理的,所以还是很考验架构设计的;

那么ASP.NETMVC的AreaRegistration是用来干什么呢,它是用来提供一个很好的接口让我们可以将Controller定义在其他的Library项目中,这主要可以用来解决模块化开发;一般情况下我们很少将所有的东西都定义在WebApplication中,而是会根据业务需要或者架构需要划分出一系列的Library项目来,从而让我们的逻辑架构更清晰也让物理架构的设计很灵活点,比如:横向的扩展,动态设计业务模块,WEBAPI等等;

但是Routing跟MVC没有必然的关系,都是可以通过扩展的方式嵌入各自想要的功能点,Routing是在提供自定义IHttpModule的方式将控制权拿到,而MVC是建立在Routing的基础上让Uri的路由为自己所用,其实准确点讲AreaRegistration适当的扩展可以用在很多的场合下,但是毕竟AreaRegistration是在ASP.NETMVC中提供出来的;

2】AreaRegistration注册路由(传递路由上下文进行模块化注册)

简单的解释,AreaRegistration是用来在ASP.NETMVC里面注册多个区域的方式;就是可以将一个大型的MVC站点划分成多个Area区域,然后各自的Area有着自己的Controller、Action、View等元素;但是一般情况我们并不会那么做,因为将站点的所有UI层中的元素切开放会给维护工作带来很大的工作量,而且我们约定俗成的是UI层的东西放在一个主的WebApplication中,然后是业务功能的划分,但是大型站点也许需要这么做;

2.1】AreaRegistration对象结构(典型的模板方法模式)

下面我们来分析一下AreaRegistration的对象结构,至少我们要搞清楚如何使用这个对象及相关的对象;

 1 using System;
 2 using System.Web.Routing;
 3
 4 namespace System.Web.Mvc
 5 {
 6     public abstract class AreaRegistration
 7     {
 8         protected AreaRegistration();
 9
10         public abstract string AreaName { get; }
11         public static void RegisterAllAreas();
12         public static void RegisterAllAreas(object state);
13         public abstract void RegisterArea(AreaRegistrationContext context);
14     }
15 }

这是AreaRegistration对象的代码结构,两个静态的重载方法是用来在Gloab.asax文件中启动全局注册用的,而带object state 参数的是用来传递到我们将要继承的对象中去的;然后剩下的一个AreaName属性、RegisterArea方法是需要我们去实现的;

其实熟悉设计模式的朋友都会对这种模式很熟悉,因为它是最典型的模板方法模式,也是设计原则中的依赖倒置原则,在内部MVC只依赖AreaRegistration对象,然后将通过RegisterArea方法将AreaRegistrationContext上下文传递到子类中去执行点东西;

这里需要强调的是,一个AreaRegistration对应一个独立的AreaRegistrationContext对象,相关的参数是在构造函数中传入的,前提是你必须实现AreaName属性;

2.2】实现AreaRegistration对象

我们来实现一个OrderAreaRegistration对象,让其继承AreaRegistration抽象类;

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Web.Mvc;
 7
 8 namespace Api.Order
 9 {
10     public class OrderAreaRegistration : AreaRegistration
11     {
12         public override string AreaName
13         {
14             get { return "Aip/Order"; }
15         }
16
17         public override void RegisterArea(AreaRegistrationContext context)
18         {
19             context.MapRoute(name: "api.order.default", url: "api/order/{controller}/{action}/{orderid}",
20                 defaults: new { controller = "OrderController", action = "GetOrderOperationDatetime", orderid = "1001" },
21                 namespaces: new string[] { "Api.Order" });
22         }
23     }
24 }

定义在api项目中的Controller:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Web.Mvc;
 7
 8 namespace Api.Order
 9 {
10     public class Order : Controller
11     {
12         public string GetOrderOperationDatetime(string orderId)
13         {
14             if (orderId.Equals("1001"))
15                 return DateTime.Now.ToString();
16             else
17                 return orderId;
18         }
19     }
20 }

然后我们得引用这个Library项目,这样它才能在启动的时候去自动的扫描到我们这个类型;

图1:

AreaRegistrationContext是使用AreaRegistraton的实现类的参数AreaName作为参数的一部分来构造特定的Context对象的;AreaRegistratioContext是表示一个区域的上下文,我们在Context里面注册的动东西都是属于当前Area的,它包括自己的Route集合;

图2:

站点顺利的路由到了我们在api.order项目中定义的OrderController;

图3:

这么来设计项目也是会多一中选择的;

 

作者:王清培

出处:http://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-08-02 13:07:01

.NET/ASP.NET MVC(模块化开发AraeRegistration)的相关文章

基于ASP.NET MVC框架开发Web论坛应用程序

我想通过本系列文章从头到尾构建一个完整的ASP.NET MVC论坛应用程序,最终的目的是探讨和推动使用ASP.NET MVC框架构建应用程序的最佳实践. 1.简介 在本篇中,我想先从全局方面介绍一下论坛应用程序的总体目标.在本篇中,我将讨论一下避免代码坏味道的重要性,还将讨论如何利用软件设计原则和模式来帮助你编写适合未来改变的富有弹性的代码.最后,我还将论证一下为什么我选择使用测试驱动开发方式构建本系列文章中的论坛应用程序. 2.什么样的软件是好的软件 我不想仅仅为了构建论坛应用程序而任意构建此

准备写个ASP.NET MVC 2开发的系列文章

正准备中,已经在用ASP.NET MVC 2.0 写开源博客系统了 开源项目地址:http://rorowo.codeplex.com/

ASP.NET MVC框架开发系列教程

本系列教程是自己在工作中使用到而记录的,如有错误之处,请给与指正 文章目录 MVC4 开篇 第一章 初识MVC4 第二章 下山遇虎(@helper) 第三章 Models模块属性详解 第四章 在MVC4.0中对脚本以及样式表的引用变化 第五章 MVC之Bundle详解 第六章 MVC之 FileResult 和 JS请求二进制文件  

Asp.net MVC网站开发中列表界面的枚举进行翻译

问题描述 目前很多列表界面的状态字段都是显示1,2,3等原始数据的,要翻译成具体的意义,代码是怎么样的,求解? 解决方案 解决方案二:这不看你自己啦.前台用JS去实现,或者后台直接组织成需要的有意义的数据再传给前台解决方案三:使用枚举类型.ef5以后支持将整数字段映射为枚举.

ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用

ASP.NET由于采用了管道式设计,具有很好的扩展性,而整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的.通过上面对ASP.NET管道设计的介绍,我们知道ASP.NET的扩展点只要体现在HttpMoudle和HttpHandler这两个核心组建之上,实际上整个ASP.NET MVC框架就是通过自定义的HttpMoudle(UrlRoutingModule)和HttpHandler(MvcHandler)实现的.为了上读者从整体上把握ASP.NET MVC的工作机制,接下来我按照

ASP.NET MVC的View是如何被呈现出来的?[设计篇]

在前面的四篇文章中,我们介绍了各种ActionResult以及相关的请求响应机制,但是与"View的呈现"相关的ActionResult是ViewResult.通过ViewResult的执行实现的对View的呈现比上面我们介绍的各种ActionResult要复杂得多,ASP.NET MVC内部设计了一个扩展的View引擎实现了最终的View呈现工作.[本文已经同步到<How ASP.NET MVC Works?>中] 一.View引擎中的View ASP.NET MVC为我

使用asp.net mvc再造一个digg 第一部分

本文译者:第一控制.NET 学习怎样使用asp.net mvc, LINQ to SQL and ASP.NET AJAX打造一个digg类型的应用程序. 前言 前面一段时间,我一直试着学习新的ASP.NET MVC framework,我看到了很多这方面的高级话题的讨论,比如ioc容器/依赖注入,View Engine,Controller factory等.但是我找不到一篇简单的文章来展现ASP.NET MVC framework的能量.当然,知道那些高级话题确实有一些额 外的好处,但是他们

ASP.NET MVC中将控制器分离到类库的实现

         这篇文章主要介绍了ASP.NET MVC中将控制器分离到类库的实现的相关资料,需要的朋友可以参考下             前言 在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是肯定的,下面我们探讨一下Controller如何分离出去. 这里我提供

使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码_实用技巧

这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION,如:http://localhost/event/imageSet,即表示获取ImageSet对象的变更消息(新增,更新和删除消息). 1.事件消息的类IEventEntity<TEntity>类的定义 复制代码 代码如下: public interface IEntityEvent<TEntity>    {        //变