初始三层架构(超超超详细)

简介: 初始三层架构(超超超详细)

何为三层?

三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Entity)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。


看定义看不明白不要紧,上图

image.png





将上面的需求、内容抽象一下,就出了包图。(Entity类与Model类先近似认为一样)


image.png


在代码中如何实现

写代码就跟盖楼一样,先做地基、才能有上层建筑。UI层、BLL层、DAL层都引用了Model(实体)层。所以我们先写Model层。


namespace Login.Model
{
    /// <summary>
    ///实体类,用于保存用户信息。一个SQL表对应一个实体类
    /// </summary>
    public class UserInfo
    {  
        /// <summary>
        /// 封装数据
        /// </summary>
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}

DAL层的思维逻辑

1、在数据访问实现类中引用业务实体项目命名空间


2、实例化SqlConnection对象,实现数据库连接


3、实例化SqlCommand对象,执行SQL命令


4、实例化SqlDataReader对象,读取数据


5、使用实体类传递信息


层层相扣、D层需要引用Model层。具体代码如下(有详细注释哦,认真阅读)

namespace Login.DAL_
{
    class DbUtil
    {
        //创建数据库连接字符串
        public static string ConnString = @"Server =ZYB; Database =Login; User ID = sa;Password =123456";
    }
}
namespace Login.DAL_
{
    /// <summary>
    /// User类
    /// </summary>
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string password)
        {
            //实例化SqlConnection对象,实现数据库连接
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //没有分号,释放资源
            {
                //实例化SqlCommadn对象,执行SQL命令(对数据库执行操作)
                SqlCommand cmd = conn.CreateCommand();
                //连接数据库中的User表(连接数据库的代码容易出错)
                cmd.CommandText = @"SELECT ID,UserName,Password,Email
                                    FROM USERS WHERE UserName=@Username AND Password=@Password";
                cmd.CommandType = CommandType.Text;
                //给命令对象添加参数,将userName的值传给@UserName
                cmd.Parameters.Add(new SqlParameter("@UserName",userName));
                cmd.Parameters.Add(new SqlParameter("@Password",password));
                //打开数据库连接,添加后解决conn关闭异常
                conn.Open();
                //若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。
                SqlDataReader reader = cmd.ExecuteReader();
                //SqlDateReader reader = cmd.ExecuteReader();//字母打错了
                //使用实体类传递信息,初始值为null
                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;
            }
        }
    }
}
namespace Login.DAL_
{
  /// <summary>
    /// 加分类
    /// </summary>
   public class ScoreDAO
    {
        public void UpdateScore(string userName, int value)
        {
           //实例化SqlConection对象,实现数据库连接
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//自动释放资源
            {
                实例化SqlCommadn对象,执行SQL命令(对数据库执行操作)
                SqlCommand cmd = conn.CreateCommand();
                //连接数据库中的Scores表(连接数据库的代码容易出错)
                cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";
                cmd.Parameters.Add(new SqlParameter("@UserName",userName));
                cmd.Parameters.Add(new SqlParameter("@Score",value));
                //打开数据库
                conn.Open();
                //对数据库进行更新,使用ExecuteNonQuery()方法
                cmd.ExecuteNonQuery();
            }
        }
    }
}

BLL层的思维逻辑

1、在业务逻辑处理类中引用数据访问层、业务实体层命名空间


2、实例化数据访问对象


3、调用数据访问功能


4、实现业务逻辑处理功能


层层相扣,B层需要引用D层、Model层,具体代码如下。

namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model.UserInfo userLogin(string userName, string password)
        {
           //业务逻辑层需要调用数据访问层
           //实例化数据访问对象uDao
            Login.DAL_.UserDAO uDao=new Login.DAL_.UserDAO();
            //调用数据访问功能,将访问到的数据赋值给user
            Login.Model.UserInfo user= uDao.SelectUser(userName,password);
           //实现业务逻辑处理功能
            if (user!=null)//数据一致,登录成功
            {
                //实例化一个加分对象
                Login.DAL_.ScoreDAO sDao = new Login.DAL_.ScoreDAO();
                //进行加分更新
                sDao.UpdateScore(userName,10);
                //返回用户
                return user;
            }
            else
            {
                //一个throw,对应一个catch,并且弹出的内容显示在U层
                throw new Exception("登录失败!");
            }
        }
    }
}

UI层的思维逻辑

1、在窗体后台实现类中引用业务逻辑层、业务实体层命名空间


2、实例化业务逻辑处理对象和业务实体对象


3、数据绑定


4、调用业务逻辑层功能


层层相扣,U层需要引用B层、Model层。

private void btnOK_Click(object sender, EventArgs e)
{
     try
     {
          //定义变量userName,password   取出用户界面的数据
          string userName = txtName.Text.Trim();
          string password = txtPassword.Text;
          //UI层需要调用BLL层,实例化一个具体执行业务逻辑得到对象mgr,
          Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
          //调用BLL层的方法,将用户输入的信息作为参数传入方法
          //数据绑定,将用户输入的信息赋值给实体
          Login.Model.UserInfo user = mgr.userLogin(userName, password);
          MessageBox.Show("登录成功!!!" + userName);
     }
          //如果登录异常,则提示登录失败,catch 对应B层的try
          catch (Exception ex)
     {
          MessageBox.Show(ex.Message);
     }
}

相关文章
一张图理解javaEE层与层之间的关系
一张图理解javaEE层与层之间的关系
|
存储 缓存 算法
缓存层设计套路(一)
对于传统的后端业务场景或者单机应用中访问量以及对响应时间的要求均不高通常只使用DB即可满足要求。这种架构简单便于快速部署很多网站发展初期均考虑使用这种架构。但是随着访问量的上升以及对响应时间的要求提升单DB无法再满足要求。
3616 0
|
3月前
|
前端开发 IDE 数据库连接
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
本文详细介绍了ThinkPHP6中模型层的使用,包括模型属性设置、表映射关系、以及如何在控制层中使用模型层进行CRUD操作。
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
|
7月前
|
消息中间件 前端开发 测试技术
DDD - 分层架构:有效降低层与层之间的依赖
DDD - 分层架构:有效降低层与层之间的依赖
396 0
|
开发框架 小程序 JavaScript
小程序框架->框架,视图层,生命周期(逻辑层)
小程序框架->框架,视图层,生命周期(逻辑层)
59 0
|
Dubbo 前端开发 数据可视化
我为什么选择多边形架构做为工程的基础思想
这里以开源项目alinesno-cloud微服务架构的建设拆分再到整合成产品型结构的进行阐述,从原来的几十个工程基线(近百个服务模块),再到后来的20个左右产品模块的组合,进行服务能力的输出。过程工程由微服务、六边型、再到多边型工程结构的实践经验,这里偏向于工程结构以适应平台产品化发展的变更。
|
SQL 移动开发 缓存
为什么阿里建议给MVC三层架构再加一层Manager层!
为什么阿里建议给MVC三层架构再加一层Manager层!
224 0
|
开发者
数据层设计与开发(数据层工厂类) | 学习笔记
简介:快速学习数据层设计与开发(数据层工厂类)
105 0
数据层设计与开发(数据层工厂类) | 学习笔记
|
JSON 前端开发 Java
DDD专题案例二《领域层决策规则树服务设计》
在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但仅仅只是从一个简单的分层结构上依然没法理解DDD以及如何去开发这样的微服务。另外往往按照这样分层后依然感觉和MVC也没有什么差别,也没有感受到带来什么非常大的好处。那么问题出在哪呢?我个人觉得DDD学起来更像是一套指导思想,不断的将学习者引入到领域触发的思维中去,而这恰恰也是最难学习的地方。时而感觉会了,而实际开发中又不对,本来已经拆解清晰了,但怎么又那么像MVC了。甚至怀疑自己,我在干嘛?
337 0
DDD专题案例二《领域层决策规则树服务设计》
|
SQL 移动开发 缓存
为什么要在MVC三层架构上再加一层Manager层?
我们在刚刚成为程序员的时候,就会被前辈们 “教育” 说系统的设计要遵循 MVC(Model-View-Controller)架构。它将整体的系统分成了 Model(模型),View(视图)和 Controller(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是一种标准的软件分层架构。
976 0
为什么要在MVC三层架构上再加一层Manager层?