万事开头难,开始先了解的三层+抽象工厂+反射+配置文件,给后面的机房的登陆还是很有用处的。
所谓的七层(三层+抽象工厂+反射+配置文件)其实就是了解面对数据库改变等问题,它和真正的登陆还是不一样的,只能说机房利用了原理实现了登陆。接下来的更多功能也会在这个基础上。
抽象工厂(Abstract Factory)是设计模式中的一种:
它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
反射提供了描述程序集、模块和类型的对象( Type 类型)。 可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射来访问它们。
简单的来讲,就是传入所需类的字符串,然后返回这个类的实例。
配置文件为开发人员和管理员提供了对应用程序运行方式的控制权和灵活性。配置文件是可以按需要更改的 XML文件。管理员能够控制应用程序可以访问哪些受保护的资源,应用程序将使用哪些版本的程序集,以及远程应用程序和对象位于何处。开发人员可以将设置置于配置文件中,从而没有必要在每次设置更改时重新编译应用程序。
简单理解就是将软件中容易修改的内容保存到配置文件中,需要修改时,只需要修改配置文件的内容,而无需修改程序本身,重新编译。
IDAL(接口层):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JFIDAL
{
public interface IUser
{
List ShowUserInfo();//显示用户信息
}
}
DAL:
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 System.Net;
namespace JFDAL
{
public class SqlServerUser : JFIDAL.IUser
{
#region ShowUserInfo 显示用户信息
///
/// 显示用户信息
///
///
public List ShowUserInfo()
{
string sql = @"SELECT userID,userName,userSex,userLevel FROM T_User";//sql语句查询用户信息
DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql, null);
DataTable dt = ds.Tables[0];
List list = new List();
list = ConvertHelp.ToList(dt);//将datatable转换为泛型
return list;返回泛型
}
#endregion
}
}
Factory:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
//引入反射
namespace JFFactory
{
public class UserManagerFactory
{
private static readonly string AssemblyName = "JFDAL";//获取程序集名称
private static readonly string db = ConfigurationManager.AppSettings["DB"];
//读取配置文件,选择所需的数据库
public static JFIDAL.IUser creatUser()
{
string className = AssemblyName + "." + db + "User";
return (JFIDAL.IUser)Assembly.Load(AssemblyName).CreateInstance(className);
//通过反射实例化数据库相关类
}
}
}
BLL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JFBLL
{
public class UserManager
{
#region ShowUserInfo 显示用户信息
///
/// 显示用户信息
///
///
public List ShowUserInfo()
{
JFIDAL.IUser iuser = JFFactory.UserManagerFactory.creatUser();//得到实际的数据库访问实例
return iuser.ShowUserInfo();//调用ShowUserInfo方法
}
#endregion
}
}
这个和上面的代码还是不同的,上文的是精髓,下文则是应用。
这是则是小编做的登陆界面。
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 jzUI
{
public partial class frmLogin : Form
{
public frmLogin()
{
InitializeComponent();
}
private void btnLogin_Click_1(object sender, EventArgs e)
{
if (txtUserName.Text.Trim() == "")
{
MessageBox.Show("您没有输入用户名", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
if (txtpassword.Text == "")
{
MessageBox.Show("您没有输入密码", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
try
{
jfFacade.FLogin Facade = new jfFacade.FLogin();
jfEntity.ELogin user = new jfEntity.ELogin();
user.Name = txtUserName.Text.Trim();
user.Password = txtpassword.Text;
Boolean flag = false;
jfFacade.FLogin FLogin = new jfFacade.FLogin();
flag = FLogin.SelectUser(user);
if (flag != false)
{
this.Hide();
this.DialogResult = System.Windows.Forms.DialogResult.OK;
FrmMain FrmMain = new FrmMain();
FrmMain.Show();
}
else
{
MessageBox.Show("密码或者用户名错误");
}
}
catch (Exception)
{
throw;
}
}
private void btnCancel_Click_1(object sender, EventArgs e)
{
System.Environment.Exit(0);
}
}
}
接口层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using jfEntity;
using System.Data ;
namespace jfIDAL
{
public interface ILogin
{
DataTable selectUser(jfEntity.ELogin userInfo);//显示用户信息
}
}
Facade层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using jfEntity;
namespace jfFacade
{
public class FLogin
{
public Boolean SelectUser(jfEntity.ELogin user)
{
bool flag;
jzBLL .BLogin userBLL=new jzBLL .BLogin ();
flag = userBLL.UserBLL(user);
return flag;
}
}
}
工厂层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration ;
using System.Reflection;
namespace jfFactory
{
public class FaLogin
{
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
public jfIDAL.ILogin CreateUser()
{
string ClassName = StrDB + "." + "DLgion";
return (jfIDAL.ILogin)Assembly .Load (StrDB ).CreateInstance (ClassName );
}
}
}
这里小编没有写出SQLHelper,其实网上有太多SQLHelper的代码库,根本就不需要自己去码。
小编对比着写,其实也是有一个比较,但是万事不离其宗,原理更是我们需要理解的东西。