传统三层结构和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的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...
随机推荐
- linshiwendang12--匈牙利
#include<bits/stdc++.h> #define N 10007 using namespace std; vector<int> p[N]; bool vis[ ...
- VS2012配置Lua环境
1.VS2012配置BabeLua插件 2.VS2012配置Lua 1.VS2012配置BabeLua插件 BabeLua插件简介: 安装方法: 关闭VS2012后直接安装BabeLua插件. 下载地 ...
- ngcordova 监控网络制式改变
ngcordova 监控网络制式改变 keywords cordova,phonegap,ionic,network,网络制式 API参考 http://ngcordova.com/docs/plug ...
- 机器学习&&数据挖掘之一:决策树基础认识
决策树入门篇 前言:分类是数据挖掘中的主要分析手段,其任务就是对数据集进行学习并构造一个拥有预测功能的分类模型,用于预测未知样本的类标号,把类标号未知的样本按照某一规则映射到预先给定的类标号中. 分类 ...
- 【BZOJ】【2765】【JLOI2010】铁人双项比赛
计算几何/半平面交 本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个…… 我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{ ...
- Leetcode#148 Sort List
原题地址 链表归并排序 真是恶心的一道题啊,哇了好多次才过. 代码: void mergeList(ListNode *a, ListNode *b, ListNode *&h, ListNo ...
- [geeksforgeeks] Convert a given Binary Tree to Doubly Linked List
http://www.geeksforgeeks.org/in-place-convert-a-given-binary-tree-to-doubly-linked-list/ Given a Bin ...
- Windows Live Writer安装失败错误解决方案
初次使用博客园.看到官方推荐Windows Live Writer来写作博客.看着也不错.可以离线写作.不用担心浏览器突然卡卡卡,未响应的危险. Windows Live Writer是博客园推荐博客 ...
- ios 编码转换 保存文件
- (NSString *)SaveFileToDocuments:(NSString *)url { // NSString *url = @"http://172.28.250.70/a ...
- var 和 dynamic在实际项目中的应用
先回顾一下这两个关键词的用法. var是个语法糖,是在用var声明变量的那一刻就确定了其变量的类型. 因为需要在声明的时候就确定其类型,所以要求在用var声明隐式局部变量的时候必须初始化该变量. 编译 ...