Asp.net mvc 各个组件的分离
1. 系统常见的分层
在开发asp.net mvc应用的时候,visual studio 给我们创建了默认的文档结构,一般情况下我们在一个项目下工作,参考微软的官方例子:ContosoUniversity.sln

一般情况下我们可以将DAL单独出来作为一个项目,最多还加一个接口Layer的项目,构成了简单的三层架构模式。或者跟进一步讲一部分业务独立出来成为一个Business 层。分离出来的好处,相信大家都有体会:
1. 独立出来的Layer或说组件,便于替换。特别是通过接口层的引入后,能够做到程序不依赖于具体的实现类。特别是通过一些Ioc容器的注入,基本可以做到客户端(调用接口的一端)程序的零修改。这也是设计模式里讲的对扩展开发,对修改关闭原则,里氏替换原则-依赖于抽象而不是具体的原则。
2. 大的项目中,方便于多个团队的开发。比如不同的团队可以开发不同数据访问层,业务逻辑层。特别是在分布式系统开发过程中,服务端提供给客户端只是方法的接口。
3. 可维护性,当某个模块出现bug的时候,你只需改改对应的位置,然后compile,然后copy到服务器上去,不需要整体编译。
4. 版本化,不同版本的服务层可以给客户提供不同的服务。通过客户的不同身份,定位到不同的Controller。
等等,各种好处就不一一细说了。
2. 系统的进一步分层,将Controllers,Filters,Models分拆
接下来,我们来个更彻底的分离这个唯一的项目到多个项目。我们新建一个MvcApplication2项目来做试验

我们将里面的Controllers,Filters,Models作为三个项目独立出来

我们为什么要将Models独立出来?有时候出前台提交数据到Action直接包装成了Model,如果涉及到数据的更改,业务的操作,我们直接将此model作为DTO(Data Transfer Object)会比较方便。为什么将Filters,controller独立出来?大家可以参考上面的论述去琢磨下。不需要修改任何代码,只需要各个项目里面添加对应的引用即可,然后F5运行,没有任何问题。
3. 系统更进一步的分拆,将Area独立到各个模块。类似于插件式的系统开发
我们模拟两个模块Admin和api,右键添加Area…,输入Admin,右键添加Area…,输入API,新增解决方案文件夹Admin,api,然后在这两个文件夹下新建两个Application,MvcApplication1.Admin和MvcApplication1.API,然后将Areas->Admin, Areas->API下面的文件全部剪切到刚刚创建的两个项目下面。如下图

接下来,我们需要修改路由的注册部分。将主程序里面Controller的寻找的命名空间给明确下。

同理修改Admin和api模块的AreaRegistration。


再接下来,我们要添加这两个子模块的Build Events Post-build event:
mkdir "$(SolutionDir)$(SolutionName)\Areas\Admin\Views"
xcopy "$(ProjectDir)Views" "$(SolutionDir)$(SolutionName)\Areas\Admin\Views" /S /E /C /Y
将对应的View Copy 到主目录。这是ASP.NET MVC Area寻找View的机制,除非我们自定义ViewEngine。
然后build all,F5运行。
如果你认为上面的做法比较麻烦,那么可以采用第二种方式,引用第三方库MvcContrib。
在Package Manager Console里面输入:Install-Package MvcContrib,但是本人在mvc4下没有试验出来。下篇介绍asp.net mvc插件式架构
Asp.net mvc 各个组件的分离的更多相关文章
- ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版
MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...
- ASP.NET MVC 实现区域 项目分离 (比较好的方式)
说明: ZRT.Web 是前台网站,目录[D:\ZRT.Web\] ZRT.Admin 是后台管理,目录[D:\ZRT.Web\Applications\Admin\],删除文件[Global.asa ...
- ASP.NET MVC 5 访问在views文件夹中的JS文件。 ASP.NET MVC html与JS分离
修改VIEWS文件夹下的web.config文件, 加入下面红色字标识的内容: <system.webServer> <handlers> <r ...
- ASP.NET MVC掉过的坑_MVC初识及MVC应用程序结构
APS.Net MVC 浅谈[转] 来自MSDN 点击访问 MVC 理论结构 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成三个主要组件:模型.视图和控制器. ASP.NET MVC 框架 ...
- ASP.NET MVC 3 初认知
什么是ASP.NET MVC 1. asp.net mvc 是微软官方提供的mvc模式编写asp.net web应用程序的框架. 2. 是微软既asp.net webForm 后的又一种开放方式,而非 ...
- ASP.NET MVC概述
原文:http://www.asp.net/mvc/tutorials/older-versions/overview/asp-net-mvc-overview 这篇文章帮助你了解关于ASP.NET ...
- 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...
- ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件
阅读目录 Bootstrap 导航条 列表组 徽章 媒体对象 页头 路径导航 分页 输入框组 按钮式下拉菜单 警告框 进度条 小结 Bootstrap为我们提供了十几种的可复用组件,包括字体图标.下拉 ...
- React+BootStrap+ASP.NET MVC实现自适应和组件的复用
系统展示如下 1.前端采用bootstrap3进行架构 2.后端采用asp.net mvc进行开发 开发工具vs2010 mvc4需要安装sp1的补丁. 3.js组件的封装采用react 1.新建mv ...
随机推荐
- html中a标签href属性的一个坑
由于公司需要,小菜最近在搞app web开发,目前只有ios和android版本,虽然仅此两个版本,但是依然要考虑浏览器兼容性问题,因为android和ios默认浏览器内核是不一样的. 先说说兼容性问 ...
- [BTS] Error Can't update assemblies.
Removal of the assembly failed. Make sure that all items in the assembly you are trying to remove fu ...
- cookie入门与学习
据我对cookie诞生背景的了解,cookie是由网景公司创建的,目的就是将用户的数据储存在客户端上.伴随的HTML5的出现,现在又有另外一个解决数据离线储存的方案,就是HTML5中的Web stor ...
- 虚拟机锁定文件失败,开启模块snapshot失败解决办法
今天由于没有正常关闭虚拟机,导致出现打开虚拟机提示:锁定文件失败 虚拟机开启模块snapshot失败,后来从网上找打了资料解决了.解决办法:一:打开你存放虚拟机系统文件的文件夹,注意,是系统文件,不是 ...
- iOS开发之静态库(六)—— 时空之争
前面的所有试验中,我们的静态库都支持了所有可能的指令集(i386, x86_64, armv7, armv7s, arm64),最大限 度的匹配了所有可能运行该代码的设备,使代码在当前存在的几乎所有i ...
- MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join
转载请注明出处!! 之前数据表连接操作多使用逗号或者join,对几种连接的概念一直浑浑噩噩,最近研究了一波,把这些连接的区别搞明白了. 连接:A xjoin B(主表 操作 关联表) selec ...
- JS_Ajax基础
一:Ajax ajax 的全称是Asynchronous(异步) JavaScript and XML 在不刷新页面的情况下从服务器获取,提交数据的一种数据交互方式; 二:Ajax使用步骤概括 //1 ...
- [GO编程] GO入门语法基础
学习一门语言,首先肯定是要熟悉他的语法,然后才可以进行编程开发,虽然本人使用过C++,.net等语言,不过对于GO的一些新特性还是需要多多熟悉,否则即使看得懂也写不出程序来.今天我们就开始我们的GO ...
- 【地图API】收货地址详解2
上次讲解的方法是: 在地图中心点添加一个标注,每次拖动地图就获取地图中心点,再把标注的位置设置为地图中心点.可参考教程:http://www.cnblogs.com/milkmap/p/6126424 ...
- Linux下查看mysql、apache是否安装,安装,卸载等操作
Linux下查看mysql.apache是否安装,并卸载. 指令 ps -ef|grep mysql 得出结果 root ? :: /bin/sh /usr/ ...