zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    echars柱状图修改每条柱的颜色
    vue打开到新页面,并传递参数
    彻底了解websocket原理
    bind和on的区别
    Vue如何更新子组件
    Vue父子组件生命过程
    使用css3实现动画来开启GPU加速
    前端技术体系
    Vue中的~(静态资源处理)
    垂直居中的办法小结
  • 原文地址:https://www.cnblogs.com/lucybloguniquecom/p/6021899.html
Copyright © 2011-2022 走看看