MVC
来源:互联网 发布:淘宝补差价是什么意思 编辑:程序博客网 时间:2024/06/06 06:06
三层和MVC 初识篇
最近一直都在看有关三层和MVC的资料,说来也挺可笑的,刚开始看培养目标的时候,还以为三层和MVC是同一个东西呢,所以去图书馆找资料的时候,也是想着要么找本MVC要么找本三层的书就可以了。反正两者都是一样的嘛!
随着查阅资料的增多,才发现三层和MVC还真不是同一个东西。那么三层和MVC是什么呢?它们两者有什么区别呢?由于没有项目经验,还只是在初步学习阶段,所以只能借鉴网上大部分主流的观点,先从理论上了解它们,以后会从实践中去体会和了解。
1.什么是三层? 看下面的图:
所谓的三层体系结构,就是在客户端和数据之间加入了一个“中间层”,也叫“组件层”。这里的三层体系不同于物理上的三层,而是逻辑上的三层,是一种体系结构。典型的三层体系结构是由表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)构成。
联系现实生活,就会发现用三层体系结构开发的系统与饭店类似,例如下面的这张图:
上图中可以看出,表示层对应的是饭店的服务员,直接和客户打交道。业务逻辑层对应的是饭店的厨师,负责把采购回来的食品进行加工完成,传递给服务员;数据访问层只负责数据的存储工作,类似于饭店的采购,系统里有什么数据取决于数据访问层的工作,饭店提供什么样的材料取决于采购回来什么材料。
区分层次的目的即是为了“高内聚,低耦合”的思想。就像饭店中的服务员、厨师和采购员,他们都是独立的个体,一个个体的变化和更改并不影响到另一个个体。例如,如果服务员某天离职了或是请假了,直接用其他的服务员代替即可,而厨师和采购员并不需要发生改动。
层是一种弱耦合的关系,层与层之间的依赖是向下的,底层对于上层而言是“无知”的,改变上层的设计对于其调用的底层而言没有任何的影响。
其实这里的三层并不是说只有三层,可能是有更多的层。其实相对于不分层的编程方法来说,使用三层或多层架构的应用程序反而运行效率低,代码量大,难度增加。所以三层一般是适用于大型的项目系统,使用多人多组开发。这样适用三层就有利于团队的分工合作,开发人员可以只关注整个结构中的某一层。就像上面的服务员,厨师和采购员,分工合作,各司其职。表示层:主要是指与用户交互的界面,用于显示数据和接收用户输入的数据
业务逻辑层:处在表示层与数据访问层中间,起到了数据交换中承上启下的作用;做一些有效性的验证工作,如完成数据添加,修改和查询业务等。
数据访问层:主要是负责数据库的访问。简单的说就是通过DAL对数据库进行SQL操作。
2.什么是MVC?看下面的图:
MVC全名是Model View Controller,是模型(model)-视图(View)- 控制器(Controller)的缩写。MVC开始是存在Desktop程序中,M是指数据模型,V是指用户界面,C则是控制器,MVC模式的目的就是实现Web系统的职能分工。Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示。
3.三层与MVC的区别
如果要把三层和MVC进行比较的话,那么三层架构和MVC的相同之处在于他们都有一个表现层。它们的设计理念都是一样的,即把视图设计和数据持久化 进行分离,从而降低耦合性,易于扩展,提高团队开发效率。不同的是,在三层架构中没有定义一个Controller的概念,而MVC也没有把业务的访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然,三层中也提到了Model,但是三层架构中的model是以实体类构成的,而MVC,则是由业务逻辑与数据访问组成的。
为了比较它们两者的不同,我们可以引入这么一个例子:
例如,路人甲在在安次区逛街,有人要抢劫他,打110报警了。路人乙,在广阳区也被人抢劫了他也打110报警。他们再打110的时候,接电话的是某某城市的公安局指挥中心。对于路人甲,指挥中心派出的是安次区的分警去解救。对于路人乙,指挥中心派出的是广阳区的分警去解救。对于路人甲和路人乙,他们不需要知道的是到底谁来解救他们,他们只要拨打110即可(类似于页面数据由action提交到控制器),由110的指挥中心确定他们的位置和派出地方警局去解救(控制器根据需求调用Model层去完成对应的数据处理),而三层架构中如果这两个人被抢劫了,他们直接到当地警察局(调用BLL层的方法)找警察来处理。
其实,不管是三层还是MVC,他们所分的层都相当于是一个黑盒子,我们不用知道它们内部是怎么实现的,只需要去调用它们就行了。每层只需要与上下相邻的两层打交道。当一层的局部由于技术发生改变时,只要接口不变,其他层就不需要进行任何改变。
三层架构实战篇—系统登录实例
所谓的三层分为物理上的三层和逻辑上的三层。物理上的三层包括:客户端(PC)、应用服务器、数据库服务器。逻辑上的三层,也就是我们要讨论的,分为表示层、业务逻辑层、数据访问层。实体层,严格的来说不属于三层中的任一层,它是独立于其他三个层次的,只能供其他层次进行引用,但是不能引用其他的三个层次。
下面是数据在三层中的一个具体走向图,这对于我们了解三层的一条线很有帮助。
三层应用原则:
- DAL只提供基本的数据访问,不包含任何的业务逻辑
- UI只负责显示和采集用户操作,不包含任何业务相关的逻辑处理
- BLL负责处理业务逻辑。通过获取UI传来的用户指令,执行业务逻辑,在需要访问数据源的时候,直接交个DAL进行处理。处理完成后,返回必要数据给UI。
实现步骤:
(1)前期准备:
1.根据上一层引用下一层以及实体层在各层的作用,绘制UML图。
2.根据UML图显示的关系,构建三层框架。
3.建立数据库,包含UserInfo表。
(2)代码实现阶段
1.用户界面层(LoginUI):
作用:
- 向用户展现特定业务数据
- 采集用户的输入信息和操作
原则:用户至上,兼顾简洁
添加类:frmLogin
- namespace LoginUI
- {
- public partial class frmLogin : Form
- {
- public frmLogin()
- {
- InitializeComponent();
- }
- private void btnLogin_Click(object sender, EventArgs e)
- {
- //UI层将用户输入数据传递给BLL层
- string userName = txtUserName.Text.Trim();
- string password = txtPassword.Text;
- Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
- Login.Model .UserInfo user= mgr.UserLogin (userName, password);
- //UI层返回业务层传递的数据给用户
- MessageBox.Show("登录用户:" + user.UserName);
- }
2.业务逻辑层(LoginBLL):
作用:
- 从DAL获取数据,提供UI显示
- 从UI获取用户和指令,执行业务逻辑
- 从UI获取用户和指令,通过DAL写入数据
BLL的职责机制:
UI→BLL→UI
UI→BLL→DAL→BLL→UI
添加类:LoginManager
- namespace Login.BLL
- {
- public class LoginManager
- {
- public Login.Model .UserInfo UserLogin(string userName,string password)
- {
- Login.DAL.UserDAO uDao = new Login.DAL.uDao (); //实例化DAL层
- Login.Model.UserInfo user = uDao.SelectUser(userName, password);
- //不需要访问数据源,直接执行业务逻辑
- if (user != null)
- {
- return user;
- }
- else
- {
- throw new Exception("登录失败");
- }
- }
- }
- }
3.数据访问层(LoginDAL):
作用:SELECT、INSERT/UPDATE、DELETE
添加类:UserDAO
- namespace Login.DAL
- {
- public class UserDAO
- {
- public Login.Model.UserInfo SelectUser(string userName, string Password)
- {
- //建立数据库连接
- string ConnString = @"Server =192.168.24.45;DataBase =Login; User ID =sa ;Password =123";
- using (SqlConnection conn = new SqlConnection(ConnString))
- {
- //执行SQL语句进行查询
- SqlCommand cmd = conn.CreateCommand();
- cmd.CommandText = @"SELECT ID,UserName,Password,Email
- FROM UserInfo WHERE UserName =@UserName AND Password =@Password";
- //输出查询结果
- cmd.CommandType = CommandType.Text;
- //添加两个参数
- cmd.Parameters.Add(new SqlParameter(@"UserName", userName));
- cmd.Parameters.Add(new SqlParameter(@"Password", Password));
- conn.Open();
- SqlDataReader reader = cmd.ExecuteReader();
- Login.Model.UserInfo user = null;
- //读取具体的数据
- while (reader.Read())
- {
- if (user == null)
- {
- user = new Login.Model.UserInfo();
- }
- //读取查询到的数据
- user.ID = reader.GetInt32(0);
- user.UserName = reader.GetString(1);
- user.Password = reader.GetString(2);
- if (!reader.IsDBNull(3))
- {
- user.Email = reader.GetString(3);
- }
- }
- return user;
- }
- }
- }
- }
4.实体(LoginModel):
作用:封装数据,使数据在三层中传输 ,更倾向于业务逻辑层
添加类:UserInfo
- namespace Login.Model
- {
- public class UserInfo
- {
- //定义用户属性
- public int ID { get; set; }
- public string UserName { get; set; }
- public string Password { get; set; }
- public string Email { get; set; }
- }
- }