第4章:三层架构
第4章:三层架构
本章任务
完善新增学生的功能
实现删除学生的功能
本章目标
理解什么是三层架构
能够搭建三层架构
能够在三层架构下编码会
使用ADO.NET事务处理
本章内容三层架构的必要性问题1:如果增加密码加密的功能,加密的代码放在 表示层还是数据访问层?
问题2:企业审批中不断变化的流程,反复修改整个解决方案。
三层架构中的业务层
实体类在三层中的数据传递
搭建三层架构的步骤1、创建数据访问层项目
2、创建业务逻辑层项目
3、创建表示层项目
4、创建实体类项目
5、分别添加三层对实体类项目的依赖
6、添加业务逻辑层对数据访问层的依赖
7、添加表示层对业务逻辑层的依赖
业务逻辑层中的编码
创建业务逻辑类
引用数据访问层、业务实体层命名空间
实现业务逻辑方法
调用数据访问层中的方法
实现业务处理代码
表示层中的编码
创建WinForms 窗体
引用业务逻辑层、业务实体层命名空间
实现表示层的方法
调用业务逻辑层中的方法
实现显示逻辑代码
三层架构的扩展-通用层
通用(Common)层用来复用一些软件系统中共用的技术.
例如:
通用的辅助类 ...
第1章:软件系统的分层开发
第1章:软件系统的分层开发
本章任务
使用分层的方式实现简单查询
搭建基本的分层架构
实现基本分层系统的功能
本章目标
理解分层开发的思想
掌握搭建分层架构的方法
DotNet异常处理机制及多路捕获异常
本章内容混沌的代码
表示层+数据层:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace MySchool{ pub ...
CH14-课程总复习
CH14-课程总复习本章目标
引导完成OOP课程复习
学生写复习总结
完成汽车租赁系统
本章内容1、知识点梳理
类和对象
值类型和引用类型
装箱、拆箱 造函数方法重载参数传递 集合集合初始化器非泛型集合:ArrayList、Hashtable泛型集合:List、Dictionary<K,V>
类的方法
构造函数
方法重载
参数传递
集合
集合初始化器
非泛型集合:ArrayList、Hashtable
泛型集合:List、Dictionary<K,V>
面向对象高级特性
封装
继承
子类构造过程
base关键字
继承的特性以及优点 使用虚方法或抽象方法实现多态方法重写里氏替换原则父类类型作为参数和返回值
多态
使用虚方法或抽象方法实现多态
方法重写
里氏替换原则
父类类型作为参数和返回值
文件操作
文件读写:
FileStream
StreamReader
StreamWriter
文件操作
存在性检查、复制、移动、删除、遍历等
File静态类
FileInfo类
文件夹操作
存在性检查、复制、移动、删除、遍 ...
CH13-序列化和反序列化
CH13-序列化和反序列化本章目标
理解序列化和反序列化
掌握二进制序列化和反序列化
掌握XML序列化和反序列化
本章内容1、概念
什么是序列化:
通常,我们需要将对象存储要物理存储中,这要可以释放内存,在需要的时候,我们又需要从物理存储中读回并转换回对象。
在此过程中,对象的公共字段和私有字段以及类的名称(包括该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确副本。
序列化:将对象存储到物理存储的过程称为序列化。
反序列化:
反序列化:将序列化对象读回内存的过程是反序列化。
2、序列化实现步骤
序列化一个类最简单的方式是试用如下所示的Serializable属性标记
123456789101112[Serializable]//标识类可以被序列化internal class Student{ public int StudentNo { get; set; } public string StudentName { get; set; } public in ...
CH12-操作文件
CH12-操作文件本章目标
掌握文本文件的读写
会进行文件和文件夹操作
本章内容1、文件流
关于文件概述:
IO操作:文件/文件夹操作与读写。
文件夹:用来管理计算机文件的,每一个文件夹对应一块磁盘空间。它提供了指向对应空间的地址,它没有扩展名,也就不像文件的格式用扩展名来标识。
文件:一个具有符号的一组相关联元素的有序序列。文件可以包含范围非常广泛的内容。系统和用户都可以将具有一定独立功能的程序模块、一组数据或一组文字命名为一个文件,它具有永久存储。
流:是一个字节序列,可用于对后备存储进行读取和写入操作,后备存储可以是多个存储媒介之一(例如,磁盘或内存)。
Stream 支持读取和写入字节。所有表示流的类都继承自Stream类。
流涉及三个基本操作:(1)读取– 将数据从流传输到数据结构(如字节数组)中。(2)写入– 将数据从数据源传输到流。(3)查找– 对流中的当前位置进行查询和修改。
引入System.IO命名空间—提供文件操作的类
System.IO 命名空间有各种不同的类,用于执行各种文件操作,如创建和删除文件、读取或写入文件,关闭文件等。
...
CH11-操作XML文件
CH11-操作XML文件本章目标
认识XML文件
会编写XML文件
通过C#操作XML文件
通过C#和XML文件完成相应程序
本章内容1、XML概述:
XML的概念:
XML(Extensible Markup Language)是一种用于存储和传输数据的标记语言。它由万维网联盟(W3C)开发。XML被广泛用于数据交换、数据存储、Web服务、网络协议(如SOAP)等方面。它是一种非常流行的数据格式,在Web开发中扮演着重要角色。XML与HTML类似,但XML更加灵活和可扩展,它允许开发人员创建自己的标记,而不是只限于HTML中预定义的标记。
XML的特点:
可扩展性:XML允许开发人员创建自定义的标记和元素,以表示数据和结构,这使得XML可以用于多种应用程序和领域。
结构化:XML文档由嵌套的元素和属性组成,这使得XML可以表示复杂的数据结构。
标准化:XML支持标准化的字符编码,如UTF-8和UTF-16,这使得XML可以在不同的平台和应用程序之间进行交换和处理。
简单易读:XML文档具有清晰的层次结构和良好的可读性,这使得XML易于编写和理解。
2、XML的基本 ...
CH08-使用虚方法实现多态
CH08-使用虚方法实现多态本章目标
理解为什么要使用多态?
理解多态的概念
掌握虚方法实现多态
本章内容1、多态概念
为什么要使用多态?
演示案例:通过第7章讲解的继承方式来实现学生和老师的自我介绍功能。
创建父类:Person
123456public class Person{ public int Id { get; set; } public string Name { get; set; } public int Age { get; set; }}
创建子类(学生类和老师类),实现自我介绍方法
123456789101112131415161718192021//学生类public class Student : Person{ public string hobby { get; set; } public void SayHi() { Console.WriteLine("大家好,我叫 ...
CH10-接口
CH10-接口本章目标
掌握接口基础知识
掌握接口作为一种约定和能力的含义
会使用接口实现编程
本章内容1、接口的概念
为什么要使用接口?
问题:通过OOP思想,实现防盗门的功能
分析:
门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能
将门和锁分别定义为抽象类
思考问题:防盗门可以继承门的同时又继承锁吗?如何解决此问题
1、提出需求,带领学员分析如何实现
2、按之前所学无法合理解决问题,不能让防盗门继承门的同时又继承锁,
原因两点:
第一,防盗门不是锁,不符合继承中is a的关系;
第二,C#只支持单继承。
3、说明解决办法,通过接口方可实现
什么是接口?
语法:
1234567[修饰符] interface 接口名 : 父接口1,父接口2, …… { 属性定义 方法定义}class 类名 : 父类名,接口1,接口2, …… { }
示例:
12345678910111213//定义USB接口public interface UsbInterface{ void Service (); ...
CH09-使用抽象方法实现多态
CH09-使用抽象方法实现多态本章目标
理解里氏替换原则
会使用父类类型作为参数
理解抽象类和抽象方法
理解虚方法和抽象方法的区别
本章内容1、里氏替换原则
概念:
里氏替换原则(LSP)在一个软件系统中,子类对象可以替换所有使用的父类对象,且程序行为没有变化
里氏替换原则详细解释
子类必须完全实现父类的方法:子类不应该改变父类已有方法的预期行为。如果父类中的某个方法在子类中没有被正确地实现(或者说,子类改变了父类方法的预期行为),那么当使用这个子类替换父类时,就可能会导致程序出现错误。
子类可以增加自己的特有方法:子类可以扩展父类的功能,但这不应该影响父类方法的行为。
子类返回的类型必须与父类方法返回的类型兼容:如果父类方法声明返回一个类型,那么子类中被覆盖的方法也应该返回相同类型或者其子类型。
子类不应该抛出比父类方法更多的异常:子类方法抛出的异常应该与父类方法抛出的异常类型相同或者是其子类。
子类应该尊重父类的约定和前置条件:父类在设计中可能有一些前置条件或者约束,子类在实现时必须遵循这些前置条件和约束。
示例:
1234567SE ai = new SE();SE ...
CH05-深入类的方法
CH05-深入类的方法本章目标
理解并会编写类的构造函数
会实现方法重载
C#方法的可选参数和命名参数
C#扩展方法
理解类之间的通信
本章内容1、类的构造函数
为什么要使用构造函数?
123456789static void Main(string[] args){ //创建Student对象,new Student()就是在调用系统提供的无参构造函数 Student student=new Student(); student.StudentNo="1001"; student.StudentName="张三"; student.Gedner="男";}
以上代码,当创建对象的时候,给对象的属性初始值,如果有属性未赋值,则系统会给默认值,那么当创建对象的时候,就指定初始值,有没有更简单的方式呢?
构造函数可以解决以上问题。
什么是构造函数?
概念:
构造函数是类中一种特殊的方法,方法具备如下特征:
方法名与类名相同
方法无返回值
作用:
完成对象的 ...