三层架构总结

第一章:三层结构在企业中的应用
  1.什么是三层结构?将不同功能的代码放到不同层的项目中去
    三层指:表示层、业务逻辑层、数据访问层
    三层优势:实现不同功能的代码的分离,有利与修改功能
  
  2.命名规范:
    (1)数据访问层:操作对象+Dal --->UserDal
    (2)业务逻辑层:操作对象+Bll --->UserBll

  3.搭建三层结构基本框架的步骤如下:
    (1)搭建表示层
    (2)搭建业务逻辑层
    (3)搭建数据访问层
    (4)添加各层之间的相互依赖关系

第二章:用ADO.NET实现三层结构
  1.DataSource进行绑定的对象有DataTable、DtatView、List<T>、IList<T>、DataReader、Array
 
  2.配置文件App.config在表示层,同时其它层可自如调用

  3.获取DataSet中的数据
    dsClass.Table["Class"].Rows[0]["CalssName"];
    
  4.DataView:在DataTable中,提供DataTable的动态视图、并可以对动态生成的视图中的数据进行排序、筛选
    属性 说明
    Table 获取或设置源DataTable
    Sort 获取或设置DataView的一个或多个排序列以及排序顺序
    RowFilter   获取或设置用于筛选在DataView中查看哪些行的表达式
    count       在应用RowFilter后,获取DataView中的行数 

    示例用法:
    DataSet dsStudent=new DataSet();
    DataView dvStudent=new DataView();
    dvStudent.Table=dsStudent.Tables["studentTable"];
    dvStudent.RowFilter="userState='活动'";//只能是实现一列筛选
    dvStudent.Sort="StudentName desc";
    简单写法:
    DataTable dtStudent=(DataTable)dataGridView.DataSource;
    dtStudent.Table["studentTable"].DefaultView.RowFilter="UserState='活动'";

  5.调用存储过程示例
    public int GetClassIDByClassname(string className)
    {
       int number = 0;
     SqlConnection conn=new SqlConnection(connString);
       SqlCommand objCommand=new SqlCommand("usp_SelectClassIDByClassName",conn);
       objCommand.CommandType=CommandType.StoredProcedure;
     objCommand.Parameters.AddWithValue("@ClassName",className);
     conn.open();
     SqlDataReader objReader=objCommand.ExecuteReader(CommandBehavior.CloseConnection);
     if(objReader.Read())
           number=Convert.ToInt32(objReader["ClassID"]);
     objReader.Close():
     objReader.Dispose();
     return number;
    }
    
  6.DataSet在三层结构中的主要作用是:数据传递的载体

第三章:用OOP实现三层结构
  1.在OOP实现三层结构时,实体层是三层之间数据传递的载体

  2.using关键字在C#中的两种用途
    (1)作为指令,引用命名空间
    (2)用于在using的范围末自动释放对象
  
第四章:异常处理与单元测试
  1.异常处理作用:是系统出现错误时能够继续运行

  2.异常出现的几种情况:(1) 代码错误 (2)资源不可用 (3)公共语言运行库遇到意外

  3.常见异常类型:
    SystemException:提供系统异常和应用程序异常之间的区别
    ArgumentException:当方法提供的任意一个参数无效时,引发此异常
    ArithmeticException:此异常表示由算术运算导致的错误
    DataException:如果在使用ADO.NET组件时生成错误,引发此错误
    FormatException:当参数的格式不符合被调用的参数规范时,引发此异常
    IOException:当出现I/O错误时,引发此异常,通常在操作流时发生该异常
    IndexOutOfRangeException:数组越界错误
    ArgumentNullException:将空引用传递给无效参数的方法时,引发此异常
    DivideByZeroException:除数为0错误
    OverflowException:当算术运算的结果大于定义的接收变量的范围时,引发此异常

  4.异常类常用的属性:
    ex.HelpLink="我的帮助文件.txt"       当出现异常的时候,连接到帮助文件上,以提供异常的更多信息
    ex.Source="我的程序"                 导致异常的应用程序或对象名
    ex.TargetSite                        抛出异常的方法名
    ex.StackTrace                        堆栈上方法调用的信息
    ex.Message                           提供文本,该文本描述了错误情况
    ex.InnerException                    最初发生的异常

  5.创建单元测试:保证软件的质量
    步骤如下:
      (1)创建测试
      (2)编写测试
      (3)运行测试
      (4)查看代码测试率

   常用的方法:
      Assert.AreEqual()    测试指定的值是否相等,如果相等,则测试通过
      Assert.Inconclusive()              表示一个未验证的测试
      Assert.IsTrue()                    测试指定的条件是否为True,如果为True,则测试通过
      Assert.IsNull()                    测试指定的对象是否为空引用,如果为空,测试通过
      Assert.IsNotNull()                 测试指定的对象是否为空,如果不为空,测试通过
      Assert.IsFalse()                   测试指定的条件是否为false,如果该条件为false,测试通过
    
 第五章:抽象工厂设计模式应用
   1. MySchoolDALFactory:抽象工厂和实体工厂     --->创建的是实体产品,返回的是抽象产品
      MySchoolDAL:实体产品     --->实现接口的类
      MySchoolIDAL:抽象产品    --->接口
      
   2.注意:在我们开发三层结构时,业务逻辑层可以考虑用静态类实现,因为在调用静态类的成员的时候,无须实例化对象就可以直接调用,这样可以减少我们开发的代码量和实           例化对象的繁琐的过程。另外,静态类是密封的,不能被继承,有利于提高安全性

 

补充:
  1.C#中实现注入式攻击示例: select * from [user] where [name]='jim' and pwd='123' or ''=''

  2.获取cbo的valueMember值用this.cboGrade.SelectedValue;

  3.如果DataGrideView控件中的列更改了顺序,则要在加载事件中写this.dgvTeacher.AutoGenerateColumn=false;才能实现数据和指定列的绑定

  4.AutoButton    实现回车键就做AutoButton绑定按钮的事件
    CancelButton  实现按Esc键就做CancelButton绑定按钮的事件

  5.ContextMenuStrip控件的Opening事件:可事件当ContextMenuStrip出现的时候就做指定的事情

  6.通过反射机制产生实体对象示例:
   public class CreateDal
   {
        private static string dbType = ConfigurationManager.AppSettings["dbType"].ToString();

    //T为接口,ClassName为项目名里类的名称,dbType为项目名
        public static T CreateObjDal<T>(string className)
        {
            string path = dbType;  
            className = path + "." + className; 
            return (T)Assembly.Load(path).CreateInstance(className);//反序列化程序集成对象
        }
    }

  IRoomDal roomDal = CreateDal.CreateObjDal<IRoomDal>("RoomDal");

模式
   1: 和具体的编程语言没有关系
   2: 解决某种问题的思想/方法论


工厂设计模式
   1: 简单工厂模式
 略
   2: 抽象工厂模式
   3: 反射工厂模式
 A: MySchool.SqlDAL和MySchool.SqliteDAL 某个具体工厂的产品族
    项目中的每个类是实体产品
    相同的实体产品类的名字要一致
    相同的实体产品族的命名空间要一致
    将生成的程序集路径改到表示层的bin的debug下,这样在工厂中才能找到该程序集
 B: MySchool.IDAL抽象产品族
    项目中的每个接口是抽象产品
    抽象产品作用: 约束/规范实体产品的行为或属性
           操作: 实体产品类来继承并实现抽象产品接口
 C: 工厂
    作用: 创建的是实体产品,返回的是抽象产品
    项目名称: MySchool.DALFactory
    最简单的项目,一个类,这个类中只有一个泛型方法
    通过配置文件指明要产生哪个实体产品
    操作: 指定一个产品族[命名空间]的名称:MySchool.SqlDAL

项目集合
UI
   BLL,Models
BLL
   IDAL,Models,DALFactory
IDAL       抽象产品
   Models
DALFactory 
   IDAL
Models 
   实体类
SqlDAL     实体工厂-->实体产品
   IDAL,Models
   修改生成路径
SqliteDAL  实体工厂-->实体产品
   IDAL,Models
   修改生成路径

posted @ 2012-07-22 12:38  事理  阅读(1106)  评论(0编辑  收藏  举报