三层架构总结
第一章:三层结构在企业中的应用
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
修改生成路径