【MVC 1】MVC+EF实体框架—原理解析
导读:在之前,我们学过了三层框架,即:UI、BLL、DAL。我们将页面显示、逻辑处理和数据访问进行分层,避免了一层、两层的混乱。而后,我们又在经典三层的基础上,应用设计模式:外观、抽象工厂+反射,使得经典三层演变为了七层,在一定程度上降低了U层和B层,B层和D层的耦合。
可是,怎样解决D层和数据库之间的耦合?在三层操作中,D层都是直接访问数据库而对数据进行操作,在面向对象的应用中,这似乎显得不太合理,所以,我们应用了EF框架,解决了D层和数据库之间的耦合(这在之前已经说明过了)。在三层中,我们应用了一个抽象工厂+反射和一个接口层,降低了B层和D层之间的耦合,那么由此类推,由面向接口作为切入点,有没有可能再造一个工厂+反射和接口层,从而降低U层和B层之间的耦合呢?
下面,我们来看解决办法:MVC+EF实体框架
一、认识MVC
1.1,定义
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。(摘抄于百度百科)
1.2,理解
模型图:
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。在这里的Model层,实际上可以过渡到三层中的B层和D层,在MVC中,它将业务逻辑处理和数据访问共同放置于model中,在一定程度上,内部业务和数据访问造成了混乱,耦合度很高。
View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。这一层和三层中的UI层,可以等同。
Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。很多时候,我们可能容易将这一层类推到三层中的B层,其实,它最多可以等同于七层中的外观层,因为在这里面,它并不涉及到业务逻辑的处理,它只是View和Model之间的桥梁。
1.3,问题
由MVC的理论可以看出,这里至少存在着两个问题:
1,业务逻辑处理和数据存储,被统一放置于Model层,它们之间的高耦合关系怎么处理?
2,Contorller从View提取输入数据,向Model发送,然后返回数据给View层。可以说,controller不管是下至View,或上至Model,都存在了相当可观的耦合。
我们为什么要应用设计模式、框架?我们为什么要抽象出类?我们为什么从不分层、到三层框架,再到EF、MVC,和其他更多的框架。我们都有一个共同的目的:解耦和,实现设计的重用,代码的重用,框架的重用。
二、改造MVC
2.1,Model改造
首先:在MVC中,Model被应用于业务逻辑和数据存储,结合之前所用的三层,那么我们完全可以将Model拆分为B层和D层
其次:为了降低D层和数据库之间的联系,实现面向对象的编程,这里,我们引用EF框架,利用实体映射操作数据,避免和数据库的直接操作,以及为更换数据库提供便利。
2.2,BLL改造
我们可以发现,就算我们增添了一个外观层,我们依然不能减少耦合度,就拿机房收费系统中的例子来说,如果我们要实现一个退卡,那么我们在B层就得有一个是否上机、是否存在卡号的判断,写入退卡表,同时更改学生表中的使用状态。即使,我们用一个外观,也是不能够解决这一问题的。那么,我们试图通过在B层再写一个方法去将这些东西封装,然后再由外观进行实例化这一个封装好的类。可是,这样依旧不能解决实质问题。首先,代码冗余,无法重用?其次,面向接口在哪里?
分析:由退卡可以看出:卡号是否存在,是否在上机,至少这两个判断是在很多地方都要用到的。那么我们是否可以将这些都要用到的方法,作为一个父类进行抽象,通过之类继承的方式,去实现方法的重用。比如说退卡和下机,在第一步,都需要判断是否上机,是否存在卡号。他们不同的在于之后的操作,一个写入退卡记录,一个写入上机记录,所以,它们完全可以继承于同一个类,再而写入自己需要的方法。图像展示:
注意:使用继承,最好不要超过3级。
2.3,DAL改造
由B层的改造,可以得出:我们可以将公共的方法,通过继承的方式,实现重用。那么,在D层中,同样可以。比如说,在实现机房的时候,我们大都用到了一个SQLHelper类,不过,我们是通过实例化的方式。按照分层和面向接口的原理,我们可以将这种基本的方法抽象出来(可以理解为底层),利用继承去达到重用。
附:整体框架图
说明:在B层和D层中间,添加了一个Dbsession,这里也就相当于以前所用过的接口层。
三、思考MVC
在这次的项目中,对于MVC的改造,大都也就是上面所说的了。但是我个人还有些问题:
首先,我们在B和D之间加上了Dbsession这个东西,去提供一个接口调用D层的方法。那么,在Controller和B层之间又该怎么处理?现在的方法是,在配置文件中进行配置,也就相当于以前在做机房时D层所使用过的配置文件,但是,在那时候,D层只需要一个配置文件去配置数据库地址。现在,每一次访问B层,都得在配置文件中进行配置,这样做,功能肯定可以实现,但是,性能方面呢?
思考:可不可以在controller和B层之间,建立一个反射工厂去替换掉配置文件?
其次,利用继承和接口编程,比如说在D层就有了一个类的接口可供调用,为什么还要有一个IDbsession这一层?
四、总结
应用旧知识去学习一个新东西,效率是非常高的。而学习一个新东西,如果能用旧知识去解释,那么理解也会是非常深刻的。没有所谓的框架,只是不停的在解耦和,不停的在实现重用。
可以看出来,在整个的框架中,进行了多次分层,比如说,在BLL的内部就又进行了一次分割。那么这样的做法,是将整个系统的粒度给切分得更加的细致。但是,正如三层一样,不是说东西好,就可以到处拿去用。MVC,不管有没有改造的成分,不管多优良,还是根据实际情况出发,确定要不要使用它。
【MVC 1】MVC+EF实体框架—原理解析的更多相关文章
- 【EF 1】EF实体框架 原理+实例
一.知识回顾 到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的 ...
- EF实体框架处理实体之间关联关系与EF延迟机制(下)
在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...
- EF实体框架之CodeFirst一
对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...
- EF实体框架之CodeFirst四
在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...
- C#.Net EF实体框架入门视频教程
当前位置: 主页 > 编程开发 > C_VC视频教程 > C#.Net EF实体框架入门视频教程 > kingstone金士顿手机内存卡16G仅65元 1.EF实体框架之增加查 ...
- BIM工程信息管理系统-EF实体框架数据操作基类
EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...
- Config File Settings Of EF——实体框架的配置文件设置
我亦MSDN 原文地址 http://msdn.microsoft.com/en-us/data/jj556606 Entity Framework allows a number of settin ...
- EF实体框架数据操作基类(转)
//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...
- EF实体框架数据操作接口(转)
//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...
随机推荐
- java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)
最近开始学习java并发容器,以补充自己在并发方面的知识,从源码上进行.如有不正确之处,还请各位大神批评指正. 前言: 本人个人理解,看一个类的源码要先从构造器入手,然后再看方法.下面看Bounded ...
- 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写
1.Object介绍 Object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所以可以通过向上转型的方法使用 ...
- Objective-C Numbers
In Objective-C programming language, in order to save the basic data types like int, float, bool in ...
- Yii2.0 Cookies机制和使用方法
在实际的项目开发过程中,用到了Yii2.0 Cookies机制!但是遇到一个十分奇葩的问题,同一个YII框架,backend下Cookies能够正常存储于客户端,但是frontend始终不行.文章的最 ...
- LR11安装和配置教程
LoadRunner11安装教程 #安装包文件.汉化文件.破解文件,可以自行百科来获得,这边仅提供安装步骤. 1.前期准备1)安装前需要关闭防火墙及杀毒软件2)安装路径不能包含中文字符,同时需要以管理 ...
- 申请Bing Search API
地址:https://datamarket.azure.com/home 没有帐号先注册一个,然后登录. 1:在数据中订阅Bing Search API,如果找不到就使用这个地址: https://d ...
- COGS 1710. [POJ2406]字符串的幂
★☆ 输入文件:powerstrings.in 输出文件:powerstrings.out 简单对比时间限制:3 s 内存限制:256 MB [题目描述] 对于给定的两个字符串a,b, ...
- scanf("%s",s)与gets(s)
#include <stdio.h> void fun(char s[]) {; while(s[i]!='\0') {i++;} printf("%d",i);} v ...
- 数据倾斜是多么痛?spark作业调优秘籍
目录视图 摘要视图 订阅 [观点]物联网与大数据将助推工业应用的崛起,你认同么? CSDN日报20170703——<从高考到程序员——我一直在寻找答案> [直播]探究L ...
- Luogu P4593 [TJOI2018]教科书般的亵渎
亵渎终于离开标准了,然而铺场快攻也变少了 给一个大力枚举(无任何性质)+艹出自然数幂和的方法,但是复杂度极限是\(O(k^4)\)的,不过跑的好快233 首先简单数学分析可以得出\(k=m+1\),因 ...