我们在实际应用开发中,经常遇到多人共同开发维护同一个项目情况,所以不免会出现其中一个人代码出现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. 【搬砖】安卓入门(1)- Java开发入门

    01.01_计算机基础知识(计算机概述)(了解) A:什么是计算机?计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代 ...

  2. linux上使用google身份验证器(简版)

    系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...

  3. TFS 安装错误

    错误   问题详细: HTTP 错误 500.19 - Internal Server Error   无法访问请求的页面,因为该页的相关配置数据无效.     详细错误信息     模块 Dynam ...

  4. AutoIt实现Webdriver自动化测试文件上传

    在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...

  5. 在Ubuntu中搭建.NET开发环境

    Mono简介Mono是Xamarin公司C#和CLR的ECMA标准基于开发的一个开源的.NET实现版本,它是Linux平台上开发.NET应用程序首选.同时其也提供了Xamarin.IOS和Xamari ...

  6. Unity3D和Egret3D的基情

    Unity3D依靠多平台发布这个核心特点,目前如日中天,屌丝引擎之王绝无来者.Egret白鹭引擎,也着实在微信上刷了一屏又一屏.这二者似乎风马牛不相及,但是这个无处不搞基的年代,让一切皆有可能. U3 ...

  7. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

  8. TODO:一不顺眼就换字体Go之应用篇

    TODO:一不顺眼就换字体Go之应用篇 字体,文字的外在形式特征.就是文字的风格,是文字的外衣.好的字体让人看得舒服,让人更有看.写的欲望哦.2016-11-16 GO官方博客发布了同名Go字体,并没 ...

  9. SharedPreferences 的另一种场景的用法

    SharedPreferences 的另一种场景的用法 昨天,下班在家想做什么来着,然后想用SharedPreferences存点数据,但是不知道咋地突然想到,SharedPreferences是应用 ...

  10. Python的魔法函数之 - __len__,__getitem__,__setitem__,__delitem__

    # 对象作为len()函数的参数是必须实现该方法 __len__ # 使用类似字典方式访问成员时必须实现 dic['pro_name'] __getitem__ # 使用类似字典方式设置成员时必须实现 ...