传统三层结构和MVC之于贫血模式和充血模式以及领域建模
相信很多人跟我一样,一开始在使用贫血模式的三层结构:抽象出来一个贫血的实体封装,然后把对模型的所有操作,分离出来,分离到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之于贫血模式和充血模式以及领域建模的更多相关文章
- 三层结构与MVC
实验室学弟突然又谈到了三层结构与MVC的话题,想想还是有必要整理一下这些个基本概念,且也纠正自己之前对二者的概念混淆,乃至将其错误思想指导于开发中. 关键词:三层结构(三层架构).MVC框架(思想). ...
- 三层结构、MVC的简介
以前总是听说什么三层结构.什么MVC,但是一直傻傻分不清这是什么意思,下面来简单介绍一下它们吧~ 1.三层结构 在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层 1)表现层 也就是我 ...
- mvc与三层结构
http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...
- mvc与三层结构终极区别
http://blog.csdn.net/csh624366188/article/details/7183872 http://www.cnblogs.com/zhhh/archive/2011/0 ...
- android的四层体系结构,基于mvc三层结构浅析
从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...
- JavaWEB 常用开发模式MVC+三层结构
MVC开发模式: M: Model -- JavaBean C: Controler -- Servlet V: View --- JSP 不会在word里面画画,所以就直接截了 老 ...
- java中的mvc和三层结构究竟是什么关系
一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了. 屈指一算,手头上做过的正式项目也有了四五六七个了,不管用的数据库 ...
- 三层架构和MVC
注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...
- Web项目的三层架构和MVC架构异同
http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...
随机推荐
- Java缓冲流细节
FileOutPutStream继承OutputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果.而Buffere ...
- C#绘制工行Logo
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Posix线程编程指南(1) 线程创建与取消
线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列.在串行程序基础上引入线程和进程是为了提高程序的 ...
- hdu 3046 Pleasant sheep and big big wolf 最小割
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 In ZJNU, there is a well-known prairie. And it a ...
- 【BZOJ】【1023】【SHOI2008】cactus仙人掌图
DP+单调队列/仙人掌 题解:http://hzwer.com/4645.html->http://z55250825.blog.163.com/blog/static/150230809201 ...
- Matlab交集并集的实现
>> a = [1 2 3 4 8 9]; >> b = [4 5 6 1] b = 4 5 6 1 >> c = intersect(a,b) c = 1 4 判 ...
- String str=new String("a")和String str = "a"有什么区别?
问:String str=new String("a")和String str = "a"有什么区别? 答:String str = "a" ...
- Connection reset by peer: socket write error 连数据库出现改错
1.网络原因 2.从池中获取连接后没有释放到池中导致的
- 连接ACCESS 数据库不能使用 '';文件已在使用中。
错误类型: Microsoft JET Database Engine (0x80004005) 不能使用 '':文件已在使用中. 对数据库的操作完之后,要 conn.close() 错误原因:解 ...
- 可执行文件(ELF)格式之讲解
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自 ...