[C#学习笔记27]高内聚低耦合思想与实体集合封装、模块化分层与三层结构
基于实体对象的数据返回
通过实体类封装了零散的参数,打包后给数据访问方法。数据访问方法需要把数据返回给UI,数据是多条,也就是多个实体、零散的数据。应把数据封装到实体类中,泛型集合List<T>是实体的容器,把每条数据封装成实体对象后再放到List集合中,用List集合作为方法的返回值。
优点:UI部分不需要知道数据访问是从哪里查询数据的,只使用集合即可(高内聚低耦合)
数据访问部分只需把数据封装到集合中,UI是winform、web都没关系
查询结果对象封装的时候也是比较麻烦,可以使用ORM框架解决。
使用模块化分层思想来达到其业绩项目要求
基本的分层:UI+数据访问+实体类(典型两层结构)
模块:在.NET平台是指类库项目
一个模块可以包含或多个类库项目(dll)
项目中包含的模块:
UI
数据模块:数据访问类+通用数据访问类
业务模块:三层结构必备的
通信模块、通用类模块、服务模块
三层结构
UI——业务模块——数据模块 实体模块是独立层
公司上层——中层(部门经理)——员工
业务模块作用:传递业务请求;业务分解
实现:添加4个模块(类库)

添加解决方案MyProject,类库BLL(业务逻辑类CourseManage.cs)、DAL(数据处理类CourseService.cs、SQLHelper.cs)、Models(实体类Course.h、Course.cs、CourseCategory.cs、Teacher.cs)
添加引用:UI——BLL——DAL(Models)
分层优点:
不管哪层业务变化,都不会影响其他层
后续升级也带来很大的方便
团队开发更方便
CourseManager.cs内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL;
using Models;
namespace BLL
{
/// <summary>
/// 业务逻辑类两个职责
/// 1、业务传递——隔离
/// 2、业务处理——大项目中使用
/// </summary>
public class CourseManager
{
private CourseService courseService = new CourseService();
public int AddCourse(Course course)
{
return courseService.AddCourse(course);
}
public int DeleteCourse(Course course)
{
return courseService.DeleteCourse(course);
}
public object GetCourseCount()
{
return courseService.GetCourseCount();
}
public List<Course> QueryCourseById(int courseId)
{
return courseService.QueryCourseById(courseId);
}
}
}
CourseService.cs内容如下:
using Models;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
public class CourseService
{
/// <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);
}
/// <summary>
/// 查询课程总数
/// </summary>
/// <returns></returns>
public object GetCourseCount()
{
string sql = "select Count(*) as 课程总数 from Course";
return SQLHelper.GetSingleResult(sql);
}
/// <summary>
/// 根据课程编号查询,返回集合对象
/// </summary>
/// <param name="courseId"></param>
/// <returns></returns>
public List<Course> QueryCourseById(int courseId)
{
string sql = $"select CourseId,CourseName,CourseContent,ClassHour,Credit,CategoryId,TeacherId from Course where CourseId<{courseId}";
//return SQLHelper.GetReader(sql);
SqlDataReader reader = SQLHelper.GetReader(sql);
List<Course> list = new List<Course>();
while (reader.Read())
{
list.Add(new Course//下面要读取的属性名必须在上面sql语句只能够出现,否则会出现找不到的情况
{
CourseName = reader["CourseName"].ToString(),
CourseContent = reader["CourseContent"].ToString(),
ClassHour = Convert.ToInt32(reader["ClassHour"]),
Credit = Convert.ToInt32(reader["Credit"]),
CategoryId = Convert.ToInt32(reader["CategoryId"]),
TeacherId = Convert.ToInt32(reader["TeacherId"]),
CourseId = Convert.ToInt32(reader["CourseId"])
});
}
reader.Close();
return list;
}
}
}
SQLHelper.cs内容与之前的一致,修改namespace为HAL
Course.cs内容与之前的一致,修改namespace为Models
CourseCategory.cs内容添加属性方式与Course.cs一致
Teacher.cs内容添加属性方式与Course.cs一致
Program.cs内容如下:
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BLL;
namespace MyProjectUI
{
class Program
{
static void Main(string[] args)
{
List<Course> courseList = new CourseManager().QueryCourseById(104);
foreach (var item in courseList)
{
Console.WriteLine(item.CategoryId + "\t" + item.CourseName + "\t" + item.Credit);
}
Console.Read();
}
}
}
App.config内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<connectionStrings>
<add name="connString" connectionString="server=.;database=CourseManageDB;uid=sa;pwd=123456"/>
</connectionStrings>
</configuration>