我们在实际应用开发中,经常遇到多人共同开发维护同一个项目情况,所以不免会出现其中一个人代码出现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. AndroidStudio — Error:Failed to resolve: junit:junit:4.12错误解决

    原博客:http://blog.csdn.net/u013443865/article/details/50243193 最近使用AndroidStudio出现以下问题: 解决:打开app下的buil ...

  2. linux下安装Redis以及phpredis模块

    一:redis的安装 1. 首先上官网下载Redis 压缩包,地址:http://redis.io/download 下载 2. 通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作 3. ...

  3. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...

  4. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  5. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  6. Lamda表达式多个字段排序问题 ThenBy、ThenByDescending

    示例代码: //ThenBy - 在 OrderBy 或 OrderByDescending 的基础上再正序排序 //ThenByDescending - 在 OrderBy 或 OrderByDes ...

  7. Linux下常见的IO模型

    前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...

  8. WCF学习之旅—实现支持REST服务端应用(二十三)

    在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...

  9. python property理解

    一般情况下我这样使用property: @property def foo(self): return self._foo # 下面的两个decrator由@property创建 @foo.sette ...

  10. python常用模块

    os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os ...