ASP.NET之AreaRegistration
ASP.NETMVC的AreaRegistration是用来干什么呢?
它是用来提供一个很好的接口让我们可以将Controller定义在其他的Library项目中,这主要可以用来解决模块化开发;一般情况下我们很少将所有的东西都定义在WebApplication中,而是会根据业务需要或者架构需要划分出一系列的Library项目来,从而让我们的逻辑架构更清晰也让物理架构的设计很灵活点,比如:横向的扩展,动态设计业务模块,WEBAPI等等;
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/p/3368161.html
ASP.NET之AreaRegistration的更多相关文章
- .NET/ASP.NET MVC(模块化开发AraeRegistration)
阅读目录: 1.开篇介绍 2.AreaRegistration注册路由(传递路由上下文进行模块化注册) 1]开篇介绍 ASP.NET Routing 路由功能非常强大,设计的也很巧妙:如果说ASP.N ...
- 模块化开发AraeRegistration
.NET/ASP.NET MVC(模块化开发AraeRegistration) 阅读目录: 1.开篇介绍 2.AreaRegistration注册路由(传递路由上下文进行模块化注册) 1]开篇介绍 A ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入
系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 全面解析ASP.NET MVC模块化架构方案
什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化.任意复杂的架构,你也会发现架构师也就做了这两件事. 本文将会全面的介绍我们团队在模块化设计方面取得的经验.之所以加了“全面”二字,是因为本文的内 ...
- ASP.NET MVC系列:Area
1. Area简介 ASP.NET MVC Area机制构建项目,可以将相对独立的功能模块切割划分,降低项目的耦合度. 2. Area设置Routing 新建Admin Area后,自动创建Admin ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/rel ...
- Log4net入门(ASP.NET MVC 5篇)
在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...
- Java进击C#——应用开发之Asp.net MVC
本章简言 上一章笔者讲到关于Asp.NET的知识点.了解Asp.NET基本的知识点之后,我们在来学习关于C#的MVC框架就简单多了.显然本章就是来介绍一下关于Asp.NET MVC.对于MVC的思想笔 ...
随机推荐
- PHP中应用GD2函数在图像上添加文字
<?php header("Content-type:text/html;charset=utf-8"); header("Content-type:image/g ...
- AI顶级会议以及期刊
AI顶级会议以及期刊 Upcoming Top Conferences NIPS 2009 UAI 2009 ICML 2009 COLT 2009 AISTATS 2009 CVPR 2009 IC ...
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- map vs hash_map
1. map, multimap, set, multiset g++ 中 map, multimap, set, multiset 由红黑树实现 map: bits/stl_map.h multim ...
- Linux for windows cp 数据中文乱码
今天遇到一个很奇葩的问题,不仅让我纠结了半天更影响了我的工作效率找到了一种解决方法.分享和记录下以备自己和后人参考 说下情况 本人的Linux服务器上的数据要cp到新安装的windows server ...
- CSS居中完全解决方案
上次面试面试官问到了,问了个定宽局中和不定宽局中,下来我把所有有关CSS居中都总结了一下 原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 水平居中 行内元素 把行内元素 ...
- ExtJS学习之路第二步:Ext.Component 和 Ext.dom.Element 的区别
让我们来初步的探讨下Ext.Component和Ext.Element的区别. jQuery偏重于DOM元素的操作 1.每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的D ...
- 2000多万个微信号被封全面禁止"集赞" 微信雷霆行动这次玩真的
微信雷霆行动自年初启动了打击网络黑色产业链以来,微信累计封停了2000万个招嫖账号,3万个假货公众账号,切实保护用户利益.你曾经中过招吗?Yes or No?说说你的看法吧. 同时,微信从9日起开始升 ...
- 随机Loading
using UnityEngine; using System.Collections; public class Loading : MonoBehaviour { public bool m_Is ...
- mac安装软件管家homebrew
http://www.iwangzheng.com/ 1.简介 众所周知,Mac的操作系统是基于Unix的,在这个系统上大家可以安装一些专门为mac定制开发的软件.这就带来了一个问题,手工编译每个软件 ...