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

阅读目录:设计模式

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

1】开篇介绍

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

那么今天这篇文章是一个简短的介绍如何在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中,而后是业务功能的划分,可是大型站点也许须要这么作;ide

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上下文传递到子类中去执行点东西;url

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

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:

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

 

相关文章
相关标签/搜索