我们在实际应用开发中,经常遇到多人共同开发维护同一个项目情况,所以不免会出现其中一个人代码出现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. FineBI:一个简单易用的自助BI工具

    过去,有关企业数据分析的重担都压在IT部门,传统BI分析更多面向的是具有IT背景的人员.但随着业务分析需求的增加,很多公司都希望为业务用户提供自助分析服务,将分析工作落实到业务人员手中.但同时,分析工 ...

  2. 如何区别数据库删除语句drop与delete与truncate?

    1.delete:删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行) 删除某一行:delete from 数据表名称 where 列名称=值: 删除所有行:delete*fro ...

  3. Asp.NET + SQLServer 部署注意事项

    1. 内存设置最大值(如果不设置, 会造成内存占用太大,带来性能问题) IIS 设置最大内存 sqlserver 设置最大内存

  4. 《月之猎人 (Moon Hunters)》主角设计

    原文链接 游戏开发人员,你们好! 我是 Kitfox Games 工作室的总监 Tanya,我们的工作室位于加拿大的蒙特利尔,拥有六名员工. 我们 3 月份发布了<月之猎人>游戏的桌面版, ...

  5. ASP.NET Aries DataGrid 配置表头说明文档

    DataGrid 配置表头 字段 中文 说明 Field 字段 注意:mg_ 开头的字段为层级表头 Title 列称 OrderNum 序号 显示的顺序(冻结和非冻结列是两个组的序号) Width 列 ...

  6. 镜像切换Logreader Agent报错:分发数据库中可能存在不一致的状态(续)

    报错: 分发数据库中可能存在不一致的状态: dist_backup_lsn {00000030:000001ba:0004},dist_last_lsn {00000030:000001cd:0004 ...

  7. WCF学习之旅—TcpTrace工具(二十六)

    止文(WCF学习之旅—TcpTrace工具(二十五))介绍了关于TcpTrance的一种使用方式,接下来介绍第二种使用方式. 三.通过ListenUri实现基于tcpTracer的消息路由 对于路由的 ...

  8. webService学习之路(二):springMVC集成CXF快速发布webService

    继上一篇webService入门之后,http://www.cnblogs.com/xiaochangwei/p/4969448.html ,现在我将我周六在家研究的结果公布出来 本次集成是基于之前已 ...

  9. 自定义jinja2 过滤器

    今天,我们要讲的是自定义jinja2 过滤器这个知识点,因为官方文档对此一代而过,讲得不够清楚,所以我们专门拿出来讲一下. 例子 例子写了两个自定义过滤器,一个是转换字典到字符串的过滤器,一个是返回当 ...

  10. spring boot(四):thymeleaf使用详解

    在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用.thymeleaf 是新一代的模板引擎,在spring4. ...