三层学习------登录

上篇文章说了一些关于三层的基础知识。三层包括UI(界面层)、BLL(业务逻辑层)、DAL(数据处理层)。

三层之间的关系?

(此图是依靠自己的理解画的,如果有不正确的地方,欢迎各位帮忙指正!)  

在上图中有一个Model层,下面对这个进行一下介绍……

 Model是什么呢?举个例子:如果UI层、BLL层、DAL层是饼干,现在把这三块饼干做成一个夹心饼干,那么Model就是夹心饼干的”心“。

比如安装电脑、分3部分、安装显示屏、安装主板、安装软件、第一个人安装好显示屏、会有传送带把电脑送到第二个人那、第二个人安好主板、放到传送带上、传送带也会运到第三个人那、如果没有传送带是不是每个人都要跑过去送? model就是那个传送带、把每一层的参数保存、然后其他层引用model这个类

 

为什么要分层呢?什么时候不用分层呢?

分层的目的就是为了“高内聚,低耦合”。当软件很小、要求速度、特殊需要的时候可以不用分层。

什么时候需要分层?

在软件上说如果你的程序到达了一定的复杂程度、就可以分层,如果软件特别简单,就没有必要分层。

各层的作用是什么?

1、UI层:

UI设计的原则:用户之上,兼顾简洁。向用户展现特定业务数据;采集用户的输入信息和操作。主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

2、BLL层:从DAL中获取数据,以供UI显示;从UI中获取用户指令和数据,执行业务逻辑;从UI中获取用户指令和数据,通过DAL写入数据源。即:B层就是从D层获取数据来提供给UI层使用,从UI层获取用户指令和数据,执行业务逻辑,传给D层写入数据源。

3、DAL层:从数据源加载数据;向数据源写入数据(Insert/Update);从数据源删除数据,即是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。

三层有什么优点?

1、开发人员可以只关注整个结构中的有一层

2、可以很容易的用新的实现来替换原有层次的实现

3、可以减低层与层之间的依赖

4、有利于各层逻辑的复用

5、便于团队开发。只要各层接口在开发前规定好,那么各层可以独立开发,进化或维护。

6、在后期维护的时候极大的降低了维护成本和维护时间

三层有什么缺点?

1、降低了系统的性能。如果不采用分层式结构,很多业务可以直接访问数据库,来获得相关的数据,现在必须通过中间者来访问数据。

2、又可以会导致级联修改。如果在表层中需要增加一个功能,为保证其设计符合封层式的结构,可能需要在相应的业务逻辑层和数据访问层中增加相应的代码。

代码展示:

UI层:

using System.Windows.Forms;
using LoginModel;//要加上这两行的程序集

 private void button1_Click(object sender, EventArgs e)
        {
            UserInfo user = new LoginModel.UserInfo();
            user.UserName = txtUserName.Text.Trim();
            user.Password = txtPassword.Text;
            LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();//访问B层,需要添加应用bll
                                                                    //mgr.Login(user.UserName,user.Password);

            UserInfo user1 =mgr.Login(user.UserName,user.Password);
            MessageBox.Show("登录用户:" + user.UserName);

BLL层

namespace LoginBLL
{
    public class LoginManager
    {
        public LoginModel.UserInfo Login(string Username, string password)
        {
            LoginDAL.UserDAO uDao = new LoginDAL.UserDAO();
            
            if (user != null)//如果登录成功
            {
                

                return user;
                
            }
            else
            {
                throw new Exception("登录失败!");
            }
            
        }
    }

DAL层

namespace LoginDAL
{
    public class UserDAO//验证用户名和密码
    {
        public LoginModel.UserInfo SelectUser(string userName,string password)
        {
            //using 可以自动关闭  sqlconnection是数据库的打开的连接
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {             
                SqlCommand cmd = conn.CreateCommand();
               
                cmd.CommandType = CommandType.Text;//commandtype命令文本
                
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Password", password));

                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName and Password=@Password";

                conn.Open();

                SqlDataReader reader = cmd.ExecuteReader();//执行者

                LoginModel.UserInfo user = null;

                while(reader.Read())
                {
                    if (user==null)
                    {
                        user = new LoginModel.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 LoginDAL
{
    class DbUtil
    {
        public static string ConnString = @"Server=DESKTOP;Database=Login;User ID=sa;Password=123456";//字段

    }

Model层

namespace LoginModel//在三层之间传输数据的
{
   public  class UserInfo
    {
       public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email  { get; set; }
       
    }
}

 

おすすめ

転載: blog.csdn.net/weixin_45309155/article/details/114362685