解析三层架构

引言:

大家都很清楚,去饭店吃饭,服务员只管接待客人,出事只管烹炒客人要的美食,采购员只管按客人需求采购肉、海鲜、蔬菜,他们各司其职、共同协作为客人提供美食。

三层的特点:

我们现在讲的三层架构,就是用这样工作的,他们三者中任何依着发生变化时都不会影响到其他两者的正常工作,so体现了三层的“高内聚,低耦合”的特点。

三层具体的描述:

从图中我们可以看到三层分别为:表达层(UI、用户界面层)、业务逻辑层(BLL)、数据访问层(DAL)。简单地说一下他们的作用:UI:为用户提供交互操作界面;BLL:负责关键业务的处理和数据传递;DAL:实现数据库访问。这里我就不多说了,因为大家在其他地方会看到很多更详细的说法,但总的来说,核心就是这个了。

下面看看他们之间的依赖关系:

简单解释一下,很简单,记住你的代码中所有的三层项目都会在一个解决方案中,应用关系是上面的关系就对了,之后会说代码的时候,就不说这个了。

搭建三层的步骤:

(1)搭建表达层(window)

(2)搭建业务逻辑层(类)

(3)搭建数据访问层(类)

(4)实现各层之间的相互依赖

从步骤上来讲都很好理解,但是我们都知道数据在各层之间表达需要定义,那么我们知道ADO.NET中有DataSet组件帮我们做这个工作,它是从数据园中检索到的数据在内存中的缓存,应用它回事数据结构暴露在业务逻辑层和表达层中,因此,我们引入了实体。

通过实体我们就更好的对数据进行绑定了。

ok,看看实体是怎样定义的:

三层的demo:

做过王继斌老师关于三层登陆的Demo的就很好理解了。其中他除了做了一个loginUI的介面,做了一个loginBLL和一个loginDAL还有一个是loginModel类,其中LoginModel就是实体类,它可以与UI、BLL、DAL进行双向的数据传输。下面举一个登陆的三层小例子:

UI:

namespace LoginUI0
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            //IDbConnection conn = new SqlConnection();
            //IDbCommand cmd = conn.CreateCommand();
            //cmd.CommandText = "select UserName Form USERS WHERE......";
            //cmd.ExecuteReader();

            string userName = txtName.Text.Trim();                                    //给实体层传值
            string password = txtPassword.Text;
            Login.BLL.loginService mgr = new Login.BLL.loginService();                //实例化业务层
            Login.Model .UserInfo user=mgr.UserLogin (userName, password);            //实体层传来的值

            MessageBox.Show("登陆用户:" + user.UserName);
        }
    }
}

BLL:

namespace Login.BLL
{
    public class loginService
    {
        public Login.Model.UserInfo UserLogin(string userName,string password)
        {
            //throw new NotImplementedException();
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();                           //实例化数据访问层,从中得到数据
            Login.Model.UserInfo user =uDao.SelectUser(userName,password);

            if (user!=null)                                                             //判断是否为空
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdataScore(userName, 10);
                return user;
            }
            else
            {
                throw new Exception("登陆失败!");                                     //抛出错误
            }
        }
    }
}

DAL:

连接数据库字段:

namespace Login.DAL
{
    class DbUtil
    {
        public static string ConnString = @"Server=mx; Database=Login; User ID=sa; Password=123456";//连接数据库的字段
    }
}

user表:

namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string password)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))        //用了using关键字,可以不用关闭连接
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM [dbo].[User] WHERE [email protected] AND [email protected]";
                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;                                 //声明一个变量user,初始值为null,不指向任何内存空间
                while (reader.Read())
                {
                    if (user == null)                                              //判断user是否为空
                    {
                        user = new Login.Model.UserInfo();
                    }

                    user.ID = reader.GetInt32(0);                                  //获取ID列的32为整数值 ,赋值
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }
                }

                return user;
            }
        }
    }
    }

Score表:

namespace Login.DAL
{
    public class ScoreDAO
    {
        public void UpdataScore(string userName,int value)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))                                     //连接数据库
            {
                SqlCommand cmd =conn.CreateCommand();                                                             //command类
                cmd.CommandText = @"INSERT INTO Score(UserName,Score) Values(@UserName,@Scores)";                 //插入列
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));                                      //增加属性
                cmd.Parameters.Add(new SqlParameter("@Scores", value));

                conn.Open();
                cmd.ExecuteNonQuery();                                                                            //查询
            }
        }
    }
}

Model:

namespace Login.Model
{
    public class UserInfo                             //定义了4个属性
    {
        public int ID{get;set;}
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}

代码就是这样的,具体怎么用,就进行重构机房,很多问题就会想明白了。

解析三层架构

时间: 2024-10-28 20:51:29

解析三层架构的相关文章

ASP.NET三层架构基础详细操作图文教程(转)

本文主要讲述Asp.net B/S结构 下基础的三层架构项目.三层主要是指的界面UI层,逻辑层,数据层.界面UI层:用于用户观看,体验的表示层.逻辑层:程序运行逻辑的封装层.数据层:程序数据相关操作的封装层. 每层当中还可以进行不同的详细划分,因为是基础教程,先领新手入门,所以不进行复杂的讲解.本来出自http://www.cnntec.com 作者:A.Z猫 转载请注明,违者必究.准备工具:Microsoft Visual Studio 2008 以下简称vs08Microsoft SQLSe

理论与实际相结合——三层架构解析

通常在程序编程中我们所说的三层架构是指:显示层(UI).逻辑层(BLL)和数据访问层(DAL).对于这三层来说,分工明确,各自有各自负责的领域. UI层:1.负责向用户显示数据  2.负责采集用户输入的信息 BLL层:1.从DAL获取数据,以供UI显示 2.从UI中获取指令或数据,经业务逻辑送达到DAL DAL层:1.主要用于对数据源的增删改查的操作. 通过它们各自负责的领域我们可以看出,BLL层属于中间层,它负责UI和DAL层之间的通信.那么通常我们还会加入一个实体层(Enity):主要负责返

分享基于EF+WCF的通用三层架构及解析

本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: 2. 项目解决方案: 在传统的三层架构上增加了WcfService(服务端),WcfClientProxy(客户端服务调用),及WcfExtension(一些扩展) 3. Wcf Service的实现: 工厂实现了RemoteServiceFactory(用于远程调用)和RefServiceFac

.NET三层架构简单解析

对于三层架构来说,主要是使用设计模式的思想,对于项目的各个模块实现"高内聚,低耦合"的思想.这里就不做详细的介绍了,如果大家有兴趣,可以阅读软件工程和设计模式相关文章. 对于三层架构来说,就是使用类,把我们在做项目的过程中,可能需要反复操作数据库,反复的使用某个方法等等,可能就是操作的参数不同.如果我们如果在每次使用的时候,都去编写相应的代码,无疑会增加程序员的负担.所以,为了增加方法的重用,就把这些能够重用的方法抽象成类,以供程序员在其它地方可以调用. 当然了,这也是面向对象的一部分

从三层架构迈向领域驱动设计

本文读者基本要求:从事信息管理系统开发,略懂GOF设计模式及SOLID设计原则,对三层面向过程机械编码厌倦,并且不知道出路在何方,如果还掌握代码坏味和重构手法,那是极好的. 1. 三层架构 理论介绍-->实际经验-->总结反思 1.1 简单介绍三层架构 严格分层架构模式的特点是上层只能访问相邻的下层,其他层次间的调用都不允许.三层架构就是一种严格分层模式,它把职责划分为界面展示.业务逻辑.数据访问三层,还有一个业务实体,前面三层都要依赖它,所以它并不构成一个层.结构如图1. 三层架构的特点是一

三层架构-------理论篇

概念: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦合"的思想. 各层概念 1.表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 2.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理. 3.数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添.删除.修改.查找等. 注:应用三层离不开另一个重要的类:实体类,

关于WEB三层架构的思考

1.MVC设计思想 MVC程序设计思想是目前比较流行的WEB开发的模式,其中,M(model)是模型,即JavaBean,用来封装和保存数据:V(view)是视图,即JSP,用来显示内容:C(controller)是控制器,即servlet,用来处理业务逻辑.大致流程是这样的:编写一个JSP页面用来获取信息(如登录页面获取用户登录名.密码),并将信息封装到JavaBean中,提交到服务器端由WEB容器将数据封装成request请求,交给servlet来处理.servlet从请求中获取用户信息到数

Asp.Net之三层架构

三层架构之理论: 通常意义上讲的三层架构就是将整个项目应用划分为:表现层(UI),业务逻辑层(BLL),数据访问层(DAL).与传统的二层架构的区别在于在用户界面(UI)和数据库服务器之间,添加中间层.而中间层又可划分为业务逻辑层(BLL),数据访问层(DAL)和数据对象模型层(Model).其中的数据对象模型层(Model)可以把表当做一个对象来处理,充分体现了面向对象的思想.三层架构因为"高内聚,低耦合"的特性,更利于 系统的设计和开发,同时为可能的变更提供了更小的单元,有利于系统

C#三十六 三层架构的实现

2.1 使用DataSet构建三层结构 开发三层结构应用系统时,在表示层.业务逻辑层.数据访问层各层中如何使用DataSet呢?DataSet在三层结构中的层次如下图所示: 从图中可以看出,在三层结构中,DataSet的构建和解析工作主要在表示层.数据访问层完成,业务逻辑层主要对DataSet中的数据进行加工.处理和传递.简单地说,DataSet是整个三层结构中数据传递的介质. 2.2 三层结构中DataSet的使用 2.2.1 在表示层中使用DataSet 在表示层中使用DataSet需要做两