【翻译】Organizing ASP.NET MVC solutions 如何组织你的ASP.NET MVC解决方案
序言
时隔一年,弦哥重出江湖,对于我们学习.NET MVC那将有大大的好处,期待弦哥的重构系列。在弦哥与jerrychou的交流中提到了一篇文章http://lostechies.com/jimmybogard/2009/12/09/organizing-asp-net-mvc-solutions/ 之前大概看过,稀里糊涂也没咋认真看,其实是英文实在不咋地,这次认真看了看把这篇文章翻译了一下,希望能给大家带来帮助。
LET'S GO (原文链接)
最近,在Twitter上提出了一个问题,在ASP.NET MVC项目中,你最喜欢的项目结构或者如何组织你的解决方案?在我周围就有很不同的策略来组织项目结构,我目前确定了一个能带给我很大灵活性的解决方案。它非常简洁:

仅此而已,两个项目。那么在每个项目中都有哪些东西呢?我们先看看UI层。我们的UI只包含网站的内容,并不包含任何代码。我只的是没有任何逻辑。指的是:
1) 没有Controllers
2) 没有Models
3) 没有Global.asax
4) No code at all
为什么没有代码呢?因为当UI只包含用户界面的内容时,我的UI层现在匹配了配置架构。它包含了:
1) Views
2) CSS
3) Images
4) Global.asax
5) Web.config
6) 引用Core项目
自从我的UI层匹配了我的配置架构,那就很容易搞清楚配置是如何工作的。把controllers,models等等这些混在一起,很难决定哪些该被配置哪些不需要。然后我们可以将其分成两个部门:代码和内容。
那么代码放在哪呢?我们放到另外一个项目。我们叫他“Core”层,即核心层,但是它里面可以放任何东西。所有的代码将在一个项目中,它包括我们的持久模型,视图模型,控制器,存储,定义ORM映射,任何东西。
组织代码
至于组织代码---我喜欢让事情简单。如果可以选择的话,UI根本就不需要编译,它纯粹就是一个文件夹,包含内容。它的bin文件夹里只包含core类库项目的输出文件。
另外,我使用文件夹来组织代码。用projects来组织也没问题,但是这样就太死板并且很容易把你局限在项目层次和结构中很难去改变。用我原来的项目架构,在大项目中犯了一些小错误导致被影响,并且发现这种方法没有按照一定比例。我甚至碰到过一个团队在解决方案中有100多个项目,仅有一半的项目被之际部署。别忘了,编译期在很大程度上是处理项目中的函数。一个项目中的1000个文件的编译速度远远要快于10个项目的100文件。至少我见过快一个数量级的情况。
我碰到的另一个问题是如果你被锁定在一个项目架构中就很难重新组织代码。此外仅仅是Ctrl+F5 ,如果你想将一个文件移动到另外一个项目,那么你还要考虑源代码控制历史日志,这点是令人相当沮丧的。在最近一次重新组织代码的经验中,我们基本上失去了整个历史日志。因为我们在重新组织代码时不能使用一些基本的源码控制命令。这样加重的原因在于我们使用源码控制系统如TFS时,由于实际项目文件中嵌入了源码控制信息导致。在我们的案例中,我们必须删除所有的项目并手动重新创建。相比项目和依赖来说移动文件夹是更容易的。如果您想要重新组织代码这点必须要注意。
如果你在代码库分层上有疑问那么建项目是最好的解决办法。它能很好的强制你引用依赖,迫使你遵守一些基本的规则。然而,在你开始创建“Common”类库项目,“Configuration”项目和“Mappings”项目等等项目时,一旦你领悟到这点,你就会考虑将他们移植到一个项目中。持续坚持下来的话,在日常工作中会产生代码冲突,从这点上看这样做似乎是不值得的。
那么为啥不只创建一个UI项目呢?将所有的代码放进去,你将获得绝对的速度和很大的灵活性体验。内容架构与组织代码具有完全不同的关注点。不管你打算如何组织你的代码,确保你的代码与UI分开并不要将代码和内容混合在一起。【end】
希望本文能给您带来帮助。
【翻译】Organizing ASP.NET MVC solutions 如何组织你的ASP.NET MVC解决方案的更多相关文章
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
- ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用
一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 使用Visual Studio Code开发基于解决方案(sln+csproj)的项目 Visual ...
- 初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序
初入码田--ASP.NET MVC4 Web应用开发之一 实现简单的登录 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查 2016-07-29 在此之前,需要一台电脑( ...
- ASP.NET MVC 4 (十一) Bundles和显示模式--asp.net mvc中 @Scripts.Render("~/bundles/jquery")是什么意思? 在布局文件中使用Scripts.Render()输出脚本包,Styles.Render()输出风格包:
ASP.NET MVC 4 (十一) Bundles和显示模式 ASP.NET MVC 4 引入的js打包压缩功能.打包压缩jquery目录下的文件,在布局文件中使用Scripts.Render()输 ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...
- Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4
Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4 Building O ...
- 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面
在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...
- 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序
学习ASP.NET MVC系列: 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器 学习ASP ...
- 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数
目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...
随机推荐
- jq實現網頁個性title
<!DOCTYPE html> <html content="text/html; charset=UTF-8"> <title>tooltip ...
- [转] linux新的API signalfd、timerfd、eventfd使用说明
http://blog.csdn.net/gdutliuyun827/article/details/8460417 三种新的fd加入linux内核的的版本: signalfd:2.6.22 time ...
- 自定义控件(视图)2期笔记08:自定义控件之 9patch图说明
1. 何为 9patch图 ? 它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片:所谓"*.9.png"这是Androi ...
- Activity的任务栈Task以及启动模式与Intent的Flag详解
什么是任务栈(Task) 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中. 其实就是以栈的 ...
- java中判断两个字符串是否相等的问题
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...
- Linux filesystem structures.
1. / – Root Every single file and directory starts from the root directory. Only root user has write ...
- 启动php-fpm报错:please specify user and group other than root
安装好PHP之后启动报错: 启动php-fpm报错:please specify user and group other than root, pool 'default 修改 php-fpm.co ...
- 测试stopwatch频率
测试stopwatch频率 using UnityEngine; using System.Collections; using System.Diagnostics; public class te ...
- 使用gdb调试(转: http://www.cnblogs.com/luchen927/archive/2012/02/07/2339003.html)
一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点.如: > ...
- 理解O/R Mapping
本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping. 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型 ...