相信很多人跟我一样,一开始在使用贫血模式的三层结构:抽象出来一个贫血的实体封装,然后把对模型的所有操作,分离出来,分离到BLL层去,然后DALL层负责把这些操作和数据库产生映射,负责读写删改的操作。

后来我开始使用Asp.net MVC来操作。网络上很多理论都是讲究:M是主要数据操作和实体,V 是显示层,一般为模板。而C是一个控制层,或者说调度层,负责把Model跟合适的View结合起来,最终呈现给用户。根据上述理论,我们可以知道V一般 为模板,而C其实是很薄的一层,只是一个负责调度。重要的层在M。M完成了所有的业务逻辑,甚至和对数据库的操作都应该如此。而事实上,我下载了很多公开 的源码的代码,自己也写了很多代码。最普通的就是依然受到三层结构的影响,把Model进行简单的封装,然后把对手数据库的操作使用EF或者 Linq封装起来,然后再Controller里面完成对数据库封装的调用,最后基本上什么都是写在Controller里面。Controller本来 应该成为一个非常薄的一层,而现在变得非常的厚重,而且好几个Action在一个 Controller里面,动辄就上千行。于是乎,大家使用了一个Service层分装起来,然后再Controller里面去调用这些Service和 Model。在某种程度上减少了一些Controller的厚度。我当时不知道Service层的时候,甚至抽象出来一个BLL层。

经过若干个小型项目的开发,我感觉到这样的开发是有一些问题和混乱的,单纯的依靠以前的三层结构是不行的,这个时候需要引入两个概念:领域建模和充血模 型。领域建模不一定非要充血模式。比如有本书《领域驱动设计C#2008实现》就是使用了贫血模式来实现的,基本上就是把行为抽象出来作为Service 来使用的。而我认为在小项目尚可如此,但是在业务逻辑比较复杂的项目,最好使用充血模式。把行为明确的最为对象的行为,写在领域模型中。 Controller直接调用领域层就可以获得对象或者修改对象的状态。对对象之间的操作,或者对象列表等不明确对象的行为的操作可以使用Service 来操作,这样业务和关系可以一目了然。

但是我也在思考几个问题,以前的Model层是单纯的封转的贫血模式,现在如果转化为充血模式,每个对象都携带了一系列的行为和方法,会不会太厚重呢?会 不会在大量的列表中呈现出太过笨重,对内存的占用到底比贫血模式差多少呢?处理起来麻烦多少呢?期待有看法的朋友一起商量。

传统三层结构和MVC之于贫血模式和充血模式以及领域建模的更多相关文章

  1. 三层结构与MVC

    实验室学弟突然又谈到了三层结构与MVC的话题,想想还是有必要整理一下这些个基本概念,且也纠正自己之前对二者的概念混淆,乃至将其错误思想指导于开发中. 关键词:三层结构(三层架构).MVC框架(思想). ...

  2. 三层结构、MVC的简介

    以前总是听说什么三层结构.什么MVC,但是一直傻傻分不清这是什么意思,下面来简单介绍一下它们吧~ 1.三层结构 在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层 1)表现层 也就是我 ...

  3. mvc与三层结构

    http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...

  4. mvc与三层结构终极区别

    http://blog.csdn.net/csh624366188/article/details/7183872 http://www.cnblogs.com/zhhh/archive/2011/0 ...

  5. android的四层体系结构,基于mvc三层结构浅析

    从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...

  6. JavaWEB 常用开发模式MVC+三层结构

    MVC开发模式: M:  Model   -- JavaBean C:  Controler   --  Servlet V: View   --- JSP 不会在word里面画画,所以就直接截了 老 ...

  7. java中的mvc和三层结构究竟是什么关系

    一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了. 屈指一算,手头上做过的正式项目也有了四五六七个了,不管用的数据库 ...

  8. 三层架构和MVC

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...

  9. Web项目的三层架构和MVC架构异同

    http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...

随机推荐

  1. js之变量和作用域

    JS的变量和其他语言的变量有很大区别.JS变量时“松散型”的,决定它只是在特定时间用于保存特定的一个名字而已.由于不存在变量要保存何种数据类型,变量的值和其数据类型可以在脚本的生命周期内改变. JS两 ...

  2. Leetcode#109 Convert Sorted List to Binary Search Tree

    原题地址 跟Convert Sorted Array to Binary Search Tree(参见这篇文章)类似,只不过用list就不能随机访问了. 代码: TreeNode *buildBST( ...

  3. Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏

    #include<iostream> #include<cstdio> #include<algorithm> #define Max 1005 using nam ...

  4. IIS网站打不开错误解决方案集锦(一):编译器错误消息: 编译器失败,错误代码为 -1073741502。

    [2015-05-12解决记录] 问题:服务器上的文件一直都是好的,但是运行了很长一段时间以后,发现网站打不开,或者上传不了图片了,怎么办? 错误信息:c:\windows\system32\inet ...

  5. 在C#中调用VBScript和JavaScript等脚本的实现

    在C#中调用VBScript.JavaScript等脚本的实现 作者:郑佐 2004-04-26 以前在做工作流(workflow)项目的时候,里面有一项就是在用户制定流程定义时可以编写脚本来控制活动 ...

  6. 让IE支持max-width

    1:expression在FF下不支持 2:*html内的width不要带单位(px). 3:width:expression(eval(this.offsetWidth>1600?1600:t ...

  7. PATH环境变量和CLASSPATH环境变量详解

    大凡装过JDK的人都知道要安装完成后要设置环境变量,可是为什么要设置环境变量呢?环境变量有什么作用? 1)PATH详解: 计算机安装JDK之后,输入“javac”“java”之类的命令是不能马上被计算 ...

  8. iOS多线程的初步研究(七)-- dispatch对象

    谈起iOS的dispatch(正式称谓是Grand Central Dispatch或GCD),不得不说这又是iOS(包括MacOSX)平台的创新,优缺点这里不讨论,只有当你使用时才能真正体会到.我们 ...

  9. iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

  10. ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东

    package com.elong.ihotel.util; import org.springframework.beans.factory.DisposableBean; import org.s ...