【C#】七层登录<机房重构>
来源:互联网 发布:如何搭建网络直播平台 编辑:程序博客网 时间:2024/05/10 17:33
前言
终于开始机房重构了,在此之前,我用三层敲了机房的部分功能,感觉还不错,现在真正到了七层,还是蛮紧张的。话不多说,开始机房的七层登录。
包图
我发现好多伙伴写七层登录的时候,都喜欢分析一下包图,那我也来简单分析一下吧。
包图展现的无非就是引用关系,U层引用外观,外观引用B层,B层通过工厂创建一个接口返回给B层,然后B层通过这个接口连接到实现接口的D层,完成数据的增删改查。接下来,我说几个很重要的层。
配置文件
通过配置文件可以很方便的更改数据库,如果需要更改数据库,我只需要把配置文件中的SqlDAL改成其他数据库名字就ok了。
<?xml version="1.0" encoding="utf-8" ?><configuration> <appSettings> <add key="ConnStr" value="server=.;database="数据库名字";User ID=**;password=******"/> <add key="DB" value="SqlDAL"/> </appSettings></configuration>
B层
B层我觉得是相对重要的一层,因为几乎所有的逻辑判断全在B层,这里是思维闪光的地方。
public bool UserBLL(Entity.UserInfo UserInfo){ Factory.Factory fact = new Factory.Factory();//实例化工厂 IDAL.IDAL idal = fact.CreateUser();//调用工厂方法创建接口 DataTable table= idal.selectUser(UserInfo);//接受D层的返回值 bool flag; if (table.Rows.Count==0)//返回的DataTable类型,如果它的行数等于0,说明没有符合该帐号密码的用户 { flag = false; } else { flag = true; } return flag;}
工厂
工厂的作用就是将反射的接口返回给B层,供B层连接D层使用。
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];//接收来自配置文件的数据public IDAL.IDAL CreateUser(){ string ClassName = StrDB + "." + "DAL";//DAL层的类名 return (IDAL.IDAL)Assembly.Load(StrDB).CreateInstance(ClassName);//反射加工厂的应用}
D层
D层的作用就是连接数据库,进行增删改查,然后将结果返回。
public DataTable selectUser(Entity.UserInfo UserInfo) { SqlParameter[] sqlParams = {new SqlParameter("@userID", UserInfo.UserID),new SqlParameter("@PassWord",UserInfo.PassWord)}; string sql = @"SELECT * FROM [T_USERS] WHERE UserID=@UserID and PassWord =@PassWord"; DataTable table =SqlDAL.SQLHelper.GetDataTable(sql, CommandType.Text, sqlParams); return table; }
SqlHelper
public static string ConnectionString = ConfigurationManager.AppSettings["ConnStr"];/// <summary> ///执行带参数的查询方式,返回值为表。 /// <param name="cmdTxt" >参数cmdText为所要执行的sql语句</param > /// <param name=" cmdType">查询时的查询方式</param> /// <param name="paras" >查询时的命令参数</param> /// <returns >查询后以表的形式返回,</returns > /// </summary> /// <remarks></remarks>
public static DataTable GetDataTable(string cmdTxt, CommandType cmdType, SqlParameter[] paras){ SqlConnection conn = new SqlConnection(ConnectionString); //创建数据库的连接 SqlCommand cmd = default(SqlCommand); //定义命名变量。 DataSet adataset = null; //定义数据适配器,DataSet类表示一个存放于内存中的数据缓存 SqlDataAdapter adaptor = default(SqlDataAdapter); //SqlDataAdapter类目的是填充DataSet cmd = new SqlCommand(cmdTxt, conn); //在conn上面执行实例化命令变量,并执行语句cmdtype cmd.CommandType = cmdType; //命令执行的类型 cmd.Parameters.AddRange(paras); //命令执行的参数 adaptor = new SqlDataAdapter(cmd); //初始化 SqlDataAdapter 类的新实例,用指定的 cmd 作为 SelectCommand 的属性 adataset = new DataSet(); try { if (conn.State == ConnectionState.Closed) { conn.Open(); } adaptor.Fill(adataset); //向adaptor对象中填充查询的数据 } catch (Exception ex) { Interaction.MsgBox(ex.Message); } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } return adataset.Tables[0]; //获取包含在 DataSet 中的表的集合。 }这个是参考的一个师哥的博客,但是我发现这个SqlHelper不全,因为它每次访问数据库都会有一个返回值,而我如果要去更新表中的东西如修改密码时,它显然不是最好用的,所以我根据这个有返回值的SqlHelper,自己编写了一个没有返回值的SqlHelper。
public static bool ExecuteNonQuery(string cmdTxt, CommandType cmdType, SqlParameter[] paras){ using (SqlConnection conn = new SqlConnection(ConnectionString)) { //创建数据库的连接 SqlCommand cmd = default(SqlCommand); //定义命名变量。为什么要用default? cmd = new SqlCommand(cmdTxt, conn); //在conn上面执行实例化命令变量,并执行语句cmdtype cmd.CommandType = cmdType; //命令执行的类型 cmd.Parameters.AddRange(paras); //命令执行的参数 conn.Open(); int enq = cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery(); bool flag; if (enq > 0) { flag = true; } else { flag = false; } return flag; }}
总结
七层的代码相对于三层来说,我觉得多不了多少,但是它带来的便利是相当大的,外观模式在机房收费系统中的作用体现不大,但是反射+抽象工厂的应用,极大的方便了该系统更换数据库,只需要改一行代码,就能在完全不知道内部代码是什么的情况下完成数据库的更换,真正体现了“对修改关闭,对扩展开放”这句话。
1 1
- 【C#】七层登录<机房重构>
- 【C#】机房重构——七层登录
- 机房重构之七层登录
- 机房重构---七层登录
- 机房重构—七层登录
- 机房重构之七层登录
- 【机房重构个人版】七层登录
- 【机房重构】七层登录
- 【机房重构】七层登录
- 机房重构之七层登录
- 机房重构--七层登录
- 【VB.NET机房重构】七层登录
- 机房收费系统重构之七层系统登录
- 【机房重构】——七层登录
- 机房重构——七层登录
- 机房重构——七层登录
- 【机房重构】之七层登录不要怕
- 机房重构-七层登录(上)
- 抽象类
- 10进制数转成任意进制数
- Mac如何找到从AppStore下载的正版Xcode安装包
- POJ3264 Balanced Lineup(线段树)
- 自定义view(滑动开关)
- 【C#】七层登录<机房重构>
- ECLIPSE老插件不能安装问题
- 【React Native开发】React Native控件之Touchable*系列组件详解(18)
- web高性能三大定理及证明
- 初学Java Web,搭建开发环境(Eclipse+Tomcat+MySQL)
- AutoCompleteTextView的使用
- [Lintcode] Remove Linked List Elements 删除链表中的元素
- MySQL and SQL Injection
- 习题10-9 UVA 294 Divisors(约数)