使用ASP.NET MVC的区域(Areas)实现分部开发和集中部署

首先说明一下测试环境。如下图所示,解决方案中有三个项目。

解决方案

其中,MainWeb项目时一个空的MVC项目,没有模型、控制器和视图。

MainWeb

解决方案中的其他两个项目是类库项目,与一般的类库不同的是,FirstArea和SecondArea需要依赖System.Web和ASP.NET MVC,前者在.NET框架程序集中引用,后者可以通过NuGet安装。

类库

FirstArea和SecondArea项目中各自有一个控制器,都没有过多的代码。这两个项目代表两个不同的程序员开发的不同的后端服务。

using System.Web.Mvc;
namespace FirstArea.Controllers
{
    public class DefaultController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Text = "First";
            return View();
        }
    }
}
using System.Web.Mvc;
namespace SecondArea.Controllers
{
    public class DefaultController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Text = "Second";
            return View();
        }
    }
}

FirstArea和SecondArea项目除了控制器以外,还各自都有一个用来注册区域的类。

using System.Web;
using System.Web.Mvc;
namespace FirstArea
{
    public class FirstAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "FirstArea";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "FirstArea_default",
                "FirstArea/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}
using System.Web;
using System.Web.Mvc;
namespace SecondArea
{
    public class SecondAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "SecondArea";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "SecondArea_default",
                "SecondArea/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

最后,将FirstArea和SecondArea项目的生成路径全都改成生成到MainWeb的bin目录中。值得注意的是,MainWeb不需要引用FirstArea和SecondArea,只要这样生成到MainWeb的bin目录中,然后将MainWeb部署到IIS上,即可实现集中部署的效果。

当然,事情还没完,我们还需要验证这样的集中部署是否有效,下面我们在MainWeb中开发前端页面。

首先,在MainWeb项目中添加FirstArea和SecondArea区域,注意,如果添加的区域有注册区域的类,是需要删掉的,因为这两个区域的注册类已经在另外两个项目中定义了。

Areas

建好区域之后,按照ASP.NET MVC的约定,在Views文件夹中新建与控制器一样名称的文件夹,再新建与Action名称一样的cshtml文件。

View

View的内容很简单,就是输出在action中赋值的ViewBag。

@{
    ViewBag.Title = "Index";
}
<h2>我是 @ViewBag.Text 的View</h2>

最终的代码结构是下图这样的:

最终结构

然后运行,运行结果如下:

FirstArea
SecondArea

总结一下,通过注册区域的方式,两个程序员就能独立的开发后端的服务,然后把编译好的dll丢到网站的bin目录中,只要在网站中按约定建立好视图,这样后端即实现了服务独立,又能满足集中部署的需求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,663评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 上网已经成为了一种习惯,不管是在路上,还是在卫生间,不管是在国内,还是在国外!不过,话虽如此,目前很多出国旅游人士...
    漫游超人WiFi阅读 340评论 0 1
  • 最近在读李笑来老师的《把时间当做朋友》,书中一反普通时间管理的说法,提倡和时间做朋友。 其中有一节叫精确感知时间,...
    无尾熊自成长阅读 291评论 0 3
  • 第一泡:85度水,紫砂壶冲泡,汤色橙黄,透亮,香气透着一股山野味,茶汤淡而润 第二泡:汤色加深,喉头发甜清凉感 第...
    萱萱丫头阅读 549评论 0 0