我们在实际应用开发中,经常遇到多人共同开发维护同一个项目情况,所以不免会出现其中一个人代码出现bug质量问题导致整个项目就原地“爆炸”的惨状。在之前公司经常遇到某个人忘记更新(我就做个此事["害羞脸"])直接签入或者出现他自己的类库引用而其他人没有引用此类库导致的项目无法编译,总之由于大家编译同一个工程,耦合度太高。最近在公司也发现同样问题,今天就讲讲如和拆分项目达到降低模块间的耦合度
首先做过MVC的同学就知道在MVC中有域的概念(就是在一个大的MVC下就拆分处多个子MVC,理论上可以无限极创建子MVC)
一:创建MVC域
这是完整的一个MVC项目
 
假设有这样一个场景:有同事需要在此MVC项目下写全新的模块:
按照传统的方式全新的模块继续在此MVC中,大家共同维护,签出代码就得把和自己无关的代码也签下来(做了七八年的项目日积月累代码量还是很庞大的),而且是一个人的错误可能会导致整个MVC项目无法运行
现在我们给这个的模块创建一个全新MVC工程,使之脱离先前的束缚。
第一步:
右键MVC项目-->添加--->区域---->输入区域名称,这里我们起叫LYL
此时就会多出一个叫Areas域的文件夹,理论上可以无限创建域
  namespace Momoda //路由域的代码
{
public class LYLAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "LYL";
}
} public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"LYL_default",
"LYL/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
//此处在之后得稍作改动
);
}
}
}
注意:方便起见建议把Momoda.Web下的所有类的命名空间改为同一个(右键属性如下:
 
)
此时域还在最外面的Momoda.Web下,如和把域作为一个工程脱离Momoda.Web 呢?
此时LYL域下的MVC不算工程所以没有工程文件。关键就是让这个域有工程文件csproj,所以需要创建新的MVC项目生成这个工程文件后就可以在外部用添加现有项目的方式创建独立的模块进行开发,不用在Momoda.Web下进行开发
第二步:
我们把LYLAreaRegistration 拖出到LYL外Areas下,然后排除LYL文件夹,如下:
然后再创建一个完整的MVC起名叫LYL.MVC,并且把App_Start文件删除(因为域的路由是靠LYLAreaRegistration文件)在资源管理器中替换掉Areas下的LYL文件夹
注意:替换后必须要把LYL.MVC 文件夹重命名为之前创建的域名LYL,否则无法路由
第三步:
右键LYL解决方案添加现有项目在LYL域下找到工程文件 ( \LYL\Momoda.Web\Areas\LYL)
这样就把Momoda.Web下的LYL域给拆分出来,开发过程中只关注LYL.MVC即可,如下图:
虽然LYL.MVC 看起来是独立的项目,起始他还是Momoda.Web下的域,Momoda.Web相当于母版页,LYL.MVC 相当于子页面
第四步:
由于把LYL.MVC拆分出来后如和从Momoda.Web路由到LYL.MVC域呢?
之前创建域的时候生成了LYLAreaRegistration 域的路由文件文件,现在加一行代码即可结束MVC的项目拆分
 context.MapRoute(
name:"LYL_default",
url:"LYL/{controller}/{action}/{id}",
defaults:new { action = "Index", id = UrlParameter.Optional },
namespaces:new string[] { "LYL.Controllers" }//添加此行代码
);
注意:LYL.Controllers 是LYL域下的Controllers的命名空间,为何是域的命名空间这就不用多说了?(
由于我们把域拆分成一个项目,也就相当于是另一个程序集,所以要显式的指明命名空间,如果不把域拆分成一个独立的项目,此路由文件的namespaces参数是有默认值(当前命名空间),这就是为什么我们第一步创建域的时候没有此参数)
这是域LYL.MVC下的控制层代码:
注意此命名空间必须和上面namespaces的参数值 "LYL.Controllers" 一样
 
 
这样就达到访问Momoda.Web跨项目路由到域LYL下的LYL.MVC
到这里就结束了
下一篇讲解如和拆分MVCAPI,从而使开发人员只关注和自己有关的模块而不影响其他模块

MVC跨项目路由的更多相关文章

  1. MVC Api 的跨项目路由

    现有Momoda.Api项目,由于团队所有人在此项目下开发,导致耦合度太高,现从此接口项目中拆分出多个子项目从而避免对Momda.Api的改动导致“爆炸” MVCApi的跨项目路由和MVC有解决方式有 ...

  2. MVC 设置项目默认起始页和多级目录的路由配置

    我们新建一个MVC的项目 默认的路由是这样的,但是由于一些需求,我们需要对Controllers按照一些规则分类. 比如说我们在Controllers下面建了一个School的文件夹,然后建了一个St ...

  3. 第2章 ASP.NET MVC(URL、路由及区域)

    * { font: 17px/1.5em "Microsoft YaHei" } ASPNET MVC URL.路由及区域 一.URL.路由及区域 一.      配置路由器 1. ...

  4. 【翻译】ASP.NET MVC 5属性路由(转)

    转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...

  5. MVC 支持同名路由,不同命名空间

    有时候我们会碰到两个项目合在一起,那么必然会碰到两个同名的controller,其实MVC在注册路由,添加Route的时候可以指定当前规则解析那个命名空间下的所有Controller. 注:Contr ...

  6. 为ASP.NET MVC应用添加自定义路由

    这里,我们将学习如何给asp.net mvc应用添加自定义路由.用自定义路由来修改默认路由表. 对一些简单的asp.net mvc应用,默认的路由表就已经足够了.但是,当你需要创建特殊的路由时,就需要 ...

  7. MVC中的路由

    authour: chenboyi updatetime: 2015-05-02 16:10:04 friendly link:   目录 1,思维导图 2,MVC处理机制简图(讲解路由解析) 3,默 ...

  8. 005. Asp.Net Routing与MVC 之三: 路由在MVC的使用

    上次讲到请求如何激活Controller和Action,这次讲下MVC中路由的使用.本次两个关注点: 遗留:ModelBinder.BindModel的过程 MVC中路由的使用 MVC 5中的Acti ...

  9. 【MVC】ASP.NET MVC 4项目模板的结构简介

    引言     在VS2012新建一个窗体验证的MVC 4项目后,可以看到微软已经帮我们做了很多了,项目里面该有的都有了,完全可以看成一个简单网站.作为开发,能理解里面文件结构和作用,也算是半只脚踏进M ...

随机推荐

  1. BPM助力企业数字化转型

    自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...

  2. Oracle补全日志(Supplemental logging)

    Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...

  3. JavaMail发送邮件

    发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄 ...

  4. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  5. Xamarin中使用DatePickerDialog的相关问题

    在Xamarin中在使用Datepicker的时候,一般情况下只需要在对应的按钮或其他控件的点击事件中使用如下语句即可完成: EditText etBirthday = FindViewById< ...

  6. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  7. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

  8. 应用r.js来优化你的前端

    r.js是requireJS的优化(Optimizer)工具,可以实现前端文件的压缩与合并,在requireJS异步按需加载的基础上进一步提供前端优化,减小前端文件大小.减少对服务器的文件请求.要使用 ...

  9. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  10. ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi

    点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...