Inicio de sesión de siete capas de C #

Sobre la base de las tres capas, se han ampliado siete capas para reducir aún más el acoplamiento (grado de proximidad) entre la capa de interfaz de usuario, la capa BLL y la DAL. Primero, echemos un vistazo al breve diagrama del paquete y veamos cómo son. relación:

Se puede ver en este diagrama de paquetes que la capa de apariencia, la capa de interfaz, la capa de fábrica abstracta, la capa de entidad y la capa de entidad se pueden considerar como la capa Modelo en las tres capas. A partir del resultado, sus funciones son similares.

La capa de apariencia es principalmente para separar la capa UI y la capa BLL; la fábrica abstracta más la reflexión es principalmente para la conveniencia de reemplazar la base de datos, mientras se convierten las clases en la capa DAL a la interfaz en la capa IDAL, de modo que el BLL La capa se puede llamar llamando a la capa IDAL DAL; la capa de interfaz es principalmente para separar la capa BLL y la capa DAL.

Función de siete capas

1. Capa de interfaz (UI): se utiliza principalmente para recopilar los datos ingresados ​​por el usuario y luego pasarlos a la capa de apariencia, y luego pasarlos a la capa B para el juicio correspondiente.

2. Capa de lógica empresarial (BLL): La capa B se utiliza principalmente para el juicio lógico, llamando al método en la fábrica para crear la interfaz correspondiente.

3. Capa de acceso a datos (DAL): implementa la interfaz definida por la capa de interfaz.

4. Fachada: El propósito de usar la capa de apariencia es reducir el acoplamiento entre las capas U y B. La conexión entre las capas U y B solo necesita pasar por la interfaz de la capa Fachada, y la capa U no necesita conocer la capa B. Cuáles son los métodos internos. La capa de apariencia recibe los datos de la capa U y luego llama al método de la capa B para verificar la información.

5. Fábrica: Mediante el archivo de configuración y la fábrica abstracta, podemos cambiar la base de datos sin cambiar el código, cambiando el valor en el archivo de configuración. El trabajo que Factory necesita completar es definir una interfaz para llamar a la capa de interfaz para realizar la transferencia de datos entre la capa BLL y la capa DAL.

6. Capa de interfaz (IDAL): La capa de interfaz se utiliza para definir una interfaz unificada y desacoplar las capas B y D.

7. Entidad: Igual que la capa de entidad en las tres capas, se utiliza principalmente para transferir datos entre las capas.
El diagrama del paquete anterior ha explicado la relación de referencia muy claramente, así que comience a practicar y, al mismo tiempo, recuerde lo mismo que las tres capas, preste atención a si el nombre es consistente.

Archivo de configuración de la aplicación:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
  <appSettings>
    <add key ="ConnStr" value="server=.; database=Login;User ID = sa ; Password=123456"/>
    <!--<add key ="DB" value="DAL" />-->
    <!--SqlServer是D层类的前缀,用来区别使用的是什么类型的数据库-->
    <add key="DB" value="Login.DAL"/>
  </appSettings>
</configuration>

Entidad de la capa Entidad:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.Entity
{
    public class UserInfo
    {
        private string _userName;
        private string _passWord;
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }
        public string Password
        {
            get { return _passWord; }
            set { _passWord = value; }
        }

        
    }
}

DAL de capa de acceso a datos:

Clase LoginDAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using DAL;

namespace Login.DAL
{
    public class LoginDAL:Login.IDAL.LoginIDAL
    {
        public DataTable SelectUser(Entity.UserInfo userInfo)
        {
            CommandType Text = 0;
            SqlHelper sqlhelper = new SqlHelper();
            SqlParameter[] sqlParams = { new SqlParameter("@UserName", userInfo.UserName), new SqlParameter("@PassWord", userInfo.Password) };
            string sql = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
            DataTable table = sqlhelper.ExecuteQuery(sql, sqlParams,Text);
            return table;
        }
    }
}

Clase SQLHelper:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;

namespace DAL
{
    //数据访问层,数据操作类
    public class SqlHelper
    {
        //定义数据库连接操作,指定在数据库上操作的类型
        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;

        //数据库连接
        public SqlHelper()
        {
            string connStr = ConfigurationManager.AppSettings["connStr"];
            conn = new SqlConnection(connStr);

        }
        private SqlConnection GetConn()
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            return conn;

        }

        ///<summary>
        ///执行不带参数的数据库操作或者存储过程
        /// 增删改查操作
        /// 返回受影响的行数
        ///</summary>
        public int ExecuteNonQuery(string cmdText, CommandType ct)
        {
            int res;
            cmd = new SqlCommand(cmdText, GetConn());
            cmd.CommandType = ct;
            res = cmd.ExecuteNonQuery();
            if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();

            }

            return res;

        }
        //执行带参数的数据库操作或者存储过程
        public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
        {
            int res;
            using (cmd = new SqlCommand(cmdText, GetConn()))
            {
                cmd.CommandType = ct;
                cmd.Parameters.AddRange(paras);
                res = cmd.ExecuteNonQuery();

            }
            return res;
        }
        //执行不带参数的SqL查询语句或者存储过程
        public DataTable ExecuteQuery(string cmdText, CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText, GetConn());
            cmd.CommandType = ct;
            using (sdr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);

            }
            return dt;

        }

        //执行带参数的SQL查询语句或存储过程
        public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText, GetConn());

            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;

        }
    }
}

Capa de lógica empresarial BLL:

Clase LoginBLL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Data;


namespace Login.BLL
{
    public class LoginBLL
    {
        public bool UserBLL(Entity.UserInfo userInfo)
        {
            Login.Factory.LoginFactory fact = new Login.Factory.LoginFactory();
           
            IDAL.LoginIDAL idal = fact.CreateUser();//调用工厂方法创建接口

            DataTable table = idal.SelectUser(userInfo);//接收D层返回值

            Boolean flag;
            if (table.Rows.Count == 0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;
        }
    }
}

Fachada:

Clase LoginFacade:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.Facade
{
    public class LoginFacade
    {
        public Boolean SelectUser(Entity.UserInfo userInfo)
        {
            bool flag;
            Login.BLL.LoginBLL userBLL = new Login.BLL.LoginBLL();
            flag = userBLL.UserBLL(userInfo);
            return flag;
        }
    }
}

Fábrica de capas de fábrica abstracta:

Clase LoginFactory

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;//对配置文件的引用
using System.Reflection;//对反射的引用
using System.IO;

namespace Login.Factory
{
    public class LoginFactory
    {
        //数据程序集名称,命名空间(DAL)
        string AssemblyName = "Login.DAL";

        //接收来自配置文件的数据,这里是接收D层类名的前缀,用来区别数据库类型
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
        
        public IDAL.LoginIDAL CreateUser()
        {
            //字符串拼接,这样写就能准确获取D层的具体某个类
            
            string ClassName = StrDB +"."+ "LoginDAL";
            //定义接口类型idal,来接收返回值
            Login.IDAL.LoginIDAL idal = (Login.IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);//反射加工厂的应用---------idal返回值为空
            return idal;
        }
    }
}

Capa de interfaz IDAL:

Tipo de IDAL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Login.Entity;

namespace Login.IDAL
{

    public interface LoginIDAL
    {
        //接口函数,判断要登陆的用户名是否在数据表中存在
        DataTable SelectUser(UserInfo user);

    }
}

UI de la capa de interfaz:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string UserName = txtUserName.Text.Trim();
            string Password = txtPassword.Text;

            //验证是否为空
            if (txtUserName.Text == string.Empty)
            {
                MessageBox.Show("请输入账号!", "登录");
                return;
            }
            else
            {
                if (txtPassword.Text == string .Empty)
                {
                    MessageBox.Show("请输入密码!", "登录");
                    return;
                }
                //#region 登录
                try
                {
                    Login.Facade.LoginFacade fLogin = new Login.Facade.LoginFacade();//实例化外观
                    //Facade.LoginFacade fLogin = new Facade.LoginFacade();//实例化外观

                    Login.Entity.UserInfo user = new Login.Entity.UserInfo();
                    //Entity.UserInfo user = new Entity.UserInfo();

                    //调用外观的方法,返回给user
                    user.UserName = Convert.ToString(txtUserName.Text.Trim());
                    user.Password = Convert.ToString(txtPassword.Text);

                    Boolean flag = false;
                    flag = fLogin.SelectUser(user);

                    if (flag != false)
                    {
                        MessageBox.Show("登录成功!");
                    }
                    else
                    {
                        MessageBox.Show("密码或者用户名错误");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    
                }
            }
        }
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_37081112/article/details/103904845
Recomendado
Clasificación