[C#学习笔记26]数据和UI分层的OOP理论、分层方法、实体类封装与解析
用分层的思想设计企业级项目
对象职责明确原则,具有高可靠性、高性能、高维护性
1、在UI中,后台数据访问的代码和UI数据展示的代码,混编到一起。给团队协作带来困难,后续维护不方便
2、代码不优雅,各个功能耦合在一起,不符合OOP高内聚低耦合的做法
解决方法:按任务职责开发数据库应用程序,会有一些类的划分
1、UI用来和用户交互,给用户展示数据、获取用户数据
2、数据访问类,用来封装数据库操作的各种方法
1)使用通用数据访问类SQLHelper
2)各种数据访问方法的封装,通用一般的数据访问类
数据传递顺序:UI——>一般数据访问类——>通用数据访问类
优点:
1、UI不知道数据存到哪儿,符合“高内聚低耦合”
2、数据访问类不用关心数据从哪儿来,职责明确
UI和数据访问之间达到解耦目的,对后续项目扩展有利。
在[C#学习笔记25]的工程基础上,新建文件夹Service存放类SQLHelper和新建的类CourseService
新建的类CourseService.cs内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SQLTest
{
namespace SQLTest
{
/// <summary>
/// 课程数据访问类
/// </summary>
public class CourseService
{
public int AddCourse(string courseName,string courseContent,int classHour,int credit,int cateforyId,int teacherId)
{
string sql = "Insert into Course(CourseName,CourseContent,ClassHour,Credit,CategoryId,TeacherId)";
sql += $"values ('{courseName}','{courseContent}',{classHour},{credit},{cateforyId},{teacherId})";
//执行SQL语句
return SQLHelper.Update(sql);
}
}
}
Program.cs添加方法如下:
public static void AddCourse()
{
//通过窗体或web页面获取数据
//1、获取用户输入的信息:用户输入的每一项数据保存到局部变量中
Console.WriteLine("请输入课程名称:");//模拟从界面输入
string courseName = Console.ReadLine();
string courseContent = ".NET框架";
int classHour = 100;
int credit = 22;
int cateforyId = 11;
int teacherId = 102;
//2、调用后台数据访问方法
int result = new CourseService().AddCourse(courseName, courseContent, classHour, credit, cateforyId, teacherId);
//3、显示操作结果
Console.WriteLine("受影响行数="+ result);
}
方法参数的定义:
1、方法参数控制在1~4个最好
2、鉴于UI和数据访问类交互参数过多问题,使用“实体类”代替过多的参数
实体类:表示数据实体的类(数据表中的一条数据就是一个实体)
实体类设计一般只包括属性,并且属性和数据表的列是映射关系
数据表列名称遵循Pancal命名法
数据表有多少列就至少有多少属性
数据类型要一致
int——int
字符类型——string(char、varchar、nvarchar、text...)
浮点型——double
smalldatetime——DataTime
实体类名称与数据表名称一致
实体类个数:有多少数据表就应该有多少实体类,根据需要添加扩展的实体类
实体类作用:
封装数据:调用对象时把参数封装到实体类的属性中(参数打包)
传递数据:将数据通过实体类传递给被调用者,反之亦然
项目中通常先添加实体类,然后再增加数据访问类和其他业务类
数据访问类命名:实体类名+Service
业务逻辑类命名:实体类名称+Mananger
实体类优点:方法调用之间的参数变得精简;使用方便,UI只需把数据封装到实体类中;使方法调用的接口变得非常稳定。
添加实体类Course.cs并放在新建文件夹Modles
Course.cs中内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SQLTest
{
/// <summary>
/// 课程实体类
/// </summary>
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public string CourseContent { get; set; }
public int ClassHour { get; set; }
public int Credit { get; set; }
public int CategoryId { get; set; }
public int TeacherId { get; set; }
}
}
CourseService.cs添加增删内容如下:
/// <summary>
/// 添加课程(通过实体类作为参数)
/// </summary>
/// <param name="course">课程对象</param>
/// <returns></returns>
public int AddCourse(Course course)
{
string sql = "Insert into Course(CourseName,CourseContent,ClassHour,Credit,CategoryId,TeacherId)";
sql += $"values ('{course.CourseName}','{course.CourseContent}',{course.ClassHour},{course.Credit},{course.CategoryId},{course.TeacherId})";
//执行SQL语句
return SQLHelper.Update(sql);
}
/// <summary>
/// 删除采用对象,ORM框架中全部采用对象
/// </summary>
/// <param name="course"></param>
/// <returns></returns>
public int DeleteCourse(Course course)
{
string sql = "delete from Course where CourseId="+course.CourseId;
return SQLHelper.Update(sql);
}
Program.cs添加增删方法如下:
public static void AddCourse1()
{
//通过窗体或web页面获取数据
//1、获取用户输入的信息:用户输入的每一项数据保存到局部变量中
Console.WriteLine("请输入课程名称:");//模拟从界面输入
//封装对象:将传递的数据封装到实体属性中
Course course = new Course() {
CourseName = Console.ReadLine(),
CourseContent = ".NET框架",
ClassHour = 111,
Credit = 22,
CategoryId = 11,
TeacherId = 104
};
//2、调用后台数据访问方法
//int result = new CourseService().AddCourse(courseName, courseContent, classHour, credit, cateforyId, teacherId);
int result = new CourseService().AddCourse(course);
//3、显示操作结果
Console.WriteLine("受影响行数="+ result);
}
//删除课程对象
public static void DeleteCourse()
{
Course course = new Course { CourseId=22};
int result = new CourseService().DeleteCourse(course);
Console.WriteLine("受影响行数=" + result);
}