阅读目录:

  • 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的对象结构,至少我们要搞清楚如何使用这个对象及相关的对象;

 using System;
using System.Web.Routing; namespace System.Web.Mvc
{
public abstract class AreaRegistration
{
protected AreaRegistration(); public abstract string AreaName { get; }
public static void RegisterAllAreas();
public static void RegisterAllAreas(object state);
public abstract void RegisterArea(AreaRegistrationContext context);
}
}

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

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

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

2.2】实现AreaRegistration对象

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc; namespace Api.Order
{
public class OrderAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Aip/Order"; }
} public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(name: "api.order.default", url: "api/order/{controller}/{action}/{orderid}",
defaults: new { controller = "OrderController", action = "GetOrderOperationDatetime", orderid = "" },
namespaces: new string[] { "Api.Order" });
}
}
}

定义在api项目中的Controller:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc; namespace Api.Order
{
public class Order : Controller
{
public string GetOrderOperationDatetime(string orderId)
{
if (orderId.Equals(""))
return DateTime.Now.ToString();
else
return orderId;
}
}
}

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

图1:

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

图2:

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

图3:

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

作者:王清培

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

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

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

  1. Asp.net Mvc模块化开发之分区扩展框架

    对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...

  2. Asp.net Mvc模块化开发系列(目录)

    模块化开发是非常重要的,模块化开发是个系统性问题,为此我觉得有必须要写一个系列的文章才能基本说的清楚 那又为什么要写一个目录呢? 其一.是对我昨天承诺写一个系列新的文章的回应 其二.是先写出一个大纲, ...

  3. ASP.NET MVC模块化开发——动态挂载外部项目

    最近在开发一个MVC框架,开发过程中考虑到以后开发依托于框架的项目,为了框架的维护更新升级,代码肯定要和具体的业务工程分割开来,所以需要解决业务工程挂载在框架工程的问题,MVC与传统的ASP.NET不 ...

  4. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  5. Asp.net Mvc模块化开发之“部分版本部分模块更新(上线)”

    项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可 ...

  6. net Mvc模块化开发

    Asp.net Mvc模块化开发之“部分版本部分模块更新(上线)” 项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统 ...

  7. 模块化开发AraeRegistration

    .NET/ASP.NET MVC(模块化开发AraeRegistration) 阅读目录: 1.开篇介绍 2.AreaRegistration注册路由(传递路由上下文进行模块化注册) 1]开篇介绍 A ...

  8. 全面解析ASP.NET MVC模块化架构方案

    什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化.任意复杂的架构,你也会发现架构师也就做了这两件事. 本文将会全面的介绍我们团队在模块化设计方面取得的经验.之所以加了“全面”二字,是因为本文的内 ...

  9. ASP.NETCORE MVC模块化

    ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...

  10. ASP.NET MVC 网站开发总结(三) ——图片截图上传

    本着简洁直接,我们就直奔主题吧,这里需要使用到一个网页在线截图插件imgareaselect(请自行下载). 前台页面: <!DOCTYPE html> <html> < ...

随机推荐

  1. 相克军_Oracle体系_随堂笔记010-SCN

    1.SCN的意义?system change number     时间    先后.新旧 select dbms_flashback.get_system_change_number, SCN_TO ...

  2. solr教程

    转载请注明出处:http://www.cnblogs.com/zhuxiaojie/p/5764680.html 本教程基于solr5.5 前言 至于为什么要用solr5.5,因为最新的6.10,没有 ...

  3. spring boot 配置启动后执行sql, 中文乱码

    spring.datasource.schema指定启动后执行的sql文件位置. 我发现中文乱码,原因是没有指定执行sql script encoding: spring: datasource: u ...

  4. mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析

    一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器 ...

  5. jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数

    先来看一看jQuery的ajax核心处理流程($.ajax) a. ajax( [url,] options )执行流程 第一步,为传递的参数做适配.url可以包含在options中 //传递的参数只 ...

  6. 一个简单的inno setup模板

    一.模板代码 基本功能包括多路径安装.多语言.自定义图标. [Setup] ShowLanguageDialog=yes AppCopyright=Copyright Reserved(C) , 36 ...

  7. [Asp.net 5] Logging-新日志系统目录

    楼主有个美好的愿望——把asp.net 5所有能看懂的代码一一呈现给大家(比如C++,楼主就看不懂).现在已经做完了依赖注入.多语言.配置文件三部分,比较基础的日志就成为了楼主的下一个目标.下面是楼主 ...

  8. HTML5模仿逼真地球自转

    查看效果:http://hovertree.com/texiao/html5/8.htm 给我一个支点,我就可以撬动地球 阿基米德 下载 http://hovertree.com/down/h/ear ...

  9. 使用VS Code开发 调试.NET Core 应用程序

    使用VS Code开发 调试.NET Core RC2应用程序,由于.NET Core 目前还处于预览版. 本文使用微软提供的示例进行开发及调试. https://github.com/aspnet/ ...

  10. PHP5各个版本的新功能和新特性总结

    因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录:PHP5.2 以前:auto ...