登陆+抽象工厂+反射配置文件

视频中的三层例子,在敲的时候的确很好敲,但是当自己做的时候就不是这样了。

    还记得照葫芦画瓢吗?在敲机房收费系统的时候的确是照着三层加上自己的理解来敲的,整个过程下来就是完全照葫芦画瓢的。但是第一次成型,出现问题的时候,请教了别人。他将我的错误指出来,以及我自创的三层架构。看了看别人的,我的简直不堪入目。别人长得是葫芦,我这本来是葫芦根,长出来的确是丝瓜,四不像。之后忍受各种打击,坚强的把这葫芦整形,整过来了!韩国美容技术不错,我这美容技术自我感觉良好。一下便是整容后的成果。

    首先是一张Uml图。一张图把重心表达出来,自己的方向也就不会走偏了!

                                     

    这张UML图,帮了我不少的忙。最初懵懂的我逐渐清晰的认识到三层应该是什么样子的。话说原理都能听懂看懂,但是等自己实践的时候就不是这个样子了。

    在U和B层之间,用了一个外观模式,外观模式大家还能想起来吧,大概就是将一致的东西打包一下,每次放假回家米老师都会说我们不要打包小包领回家,要将东西打包一下,这样既简单又好找。在这里外观模式就是起到这么一个作用,我们都知道在B层中我们写的是各种实现的方法过程,但是有很多实现似的,比如对卡的操作,对学生的操作,等等我们 可以进行分类,也可以根据对数据库的增删改查进行分类。

    还有就是在B层和D层之间,现在的两层并不是相互联系的,而是通过工厂,接口进行联系,这样体现面向对象的开放扩展原则。同时在这张图中大家能看到Entity这个实例,这个实例是被抽象出来的,因为 在各个层都要用到,从这里也可以体现到面向对象。

    通过敲代码,虽说面向对象和面向过程在理论上可以区分,但是当我们在敲代码的时候,很难注意到,所以图还是一个很重要的辅助工具,以防我们跑偏。

看完图,接下来向大家展示我的代码:

首先 是U层代码:

  1. private void cmdLogin_Click(object sender, EventArgs e)  
  2.        {  
  3.            LoginModle.UserInfo user1 = new LoginModle.UserInfo();  
  4.            LoginModle.UserInfo user2 = new LoginModle.UserInfo();  
  5.            user2.UserName = txtUserName.Text.Trim();  
  6.            user2.Password = txtPassword.Text;  
  7.            LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();  
  8.            user1 = mgr.UserLogin(user2);  
  9.            try  
  10.            {  
  11.                MessageBox.Show(user1.UserName);  
  12.            }  
  13.            catch   
  14.            {  
  15.                MessageBox.Show("请检查用户名或密码是否正确");  
  16.            }  
  17.        }  


B层代码:

  1. public class LoginManager  
  2.   {  
  3.       Factory.DataAccess data = new Factory.DataAccess();  
  4.       public UserInfo UserLogin(UserInfo user)  
  5.       {  
  6.               LoginModle.UserInfo modle = new UserInfo();  
  7.             
  8.               data.CreateUser();  
  9.               Interface.Iuser getuser = (Interface.Iuser)data.CreateUser();  
  10.               modle = getuser.GetUser(user);  
  11.               return modle;  
  12.                 
  13.   
  14.       }  
  15.   }  


D层代码:

  1. public class SQLUser : Interface.Iuser  
  2.    {  
  3.   
  4.        public LoginModle.UserInfo GetUser(LoginModle.UserInfo user)  
  5.        {  
  6.   
  7.            using (SqlConnection conn = new SqlConnection(Dbutil.ConnString))//创建链接  
  8.            {  
  9.                SqlCommand cmd = conn.CreateCommand();  // 创建一个Cmd  
  10.                cmd.CommandText = @"select ID,UserName,Password from Users where UserName=@userName and Password=@password";  
  11.                cmd.CommandType = CommandType.Text;  
  12.                cmd.Parameters.Add(new SqlParameter("@userName", user.UserName));  
  13.                cmd.Parameters.Add(new SqlParameter("@password", user.Password));  
  14.   
  15.                conn.Open();  
  16.                SqlDataReader reader = cmd.ExecuteReader();  
  17.                LoginModle.UserInfo modle = null;  
  18.   
  19.                while (reader.Read())  
  20.                {  
  21.                    if (modle == null)  
  22.                    {  
  23.                        modle = new LoginModle.UserInfo();  
  24.                    }  
  25.                    modle.ID = reader.GetInt32(0);  
  26.                    modle.UserName = reader.GetString(1);  
  27.                    modle.Password = reader.GetString(2);  
  28.                }  
  29.   
  30.   
  31.                return modle;  
  32.            }  
  33.        }  
  34.    }  

Factory:

  1. namespace Factory  
  2. {  
  3.     public class DataAccess  
  4.     {  
  5.         private static readonly string AssemblyName = "LoginDAL";  
  6.         private static readonly string db = "SQL";  
  7.           
  8.         public   Interface.Iuser  CreateUser()  
  9.         {  
  10.             string className = AssemblyName + "." + db + "User";  
  11.             return (Interface.Iuser )Assembly.Load(AssemblyName).CreateInstance(className);  
  12.   
  13.         }          
  14.     }  
  15.      
  16. }  


interface:

  1. namespace Interface  
  2. {  
  3.   
  4.    public  interface Iuser  
  5.     {  
  6.        LoginModle.UserInfo GetUser(LoginModle.UserInfo user);  
  7.     }  
  8.    public  interface IFactory  
  9.     {  
  10.         Iuser CreatUser();  
  11.     }  
  12. }  



    这些便是我的成果,虽然在配置文件这个地方还有一些小小的错误,整形师德水平需要提高,他终究会让我磨平的。

    这个登陆经历丑陋不堪到还算对的起大众这个过程,自己每次打开VS的时候,有时候会忍不住打开这个小例子,让他在运行一次,看着都很欣慰,很有动力。整形师的技术虽有待提高,但是我坚信我会做的更好。没有一个痛苦的经历,我的收获有源自哪里呢?

posted @ 2016-11-20 20:36  天涯海角路  阅读(87)  评论(0)    收藏  举报