建立层务必使用类库选项,不要使用文件夹(没错,说的就是我自己)
一、两层架构
1.架构概述 两层架构适合小型 / 中小型项目
名称 | 标识 | 用途 |
数据访问对象 | DAL | 模型服务,需要添加Models引用 |
实体对象 | Models | 模型 |
用户界面 | UI | 交互界面,需要添加DAL和Models引用 |
文章图片
2.实体对象的序列化 序列化:将对象状态转换为可保持/传输的格式,会转换为字节流
反序列化:将流转换为对象
实现:在类中加入可序列化标记[Serializable]
二、三层架构 1.架构概述 适合大 / 中型应用开发
文章图片
文章图片
2.命名规范(通用)
文章图片
3.DAL与BLL
//BLL
publc class StudentManager
{
private StudentSeiver objStu = new StudentSeiver ();
//创建数据访问对象public List GetAllStu()
{
return objStu.GetAllStu();
//仅起数据传递作用
}public List GetStuByClass(string className)
{
if(className == null || className.lenght == 0)
return objStu.GetStu();
else
return ibjStu.GetStuByClass(className);
//根据不同查询条件实现数据访问
}
}
在主程序中,仅需调用BLL中的接口,而无需去处理DAL中的具体方法(进一步分离)
【微软相关|C#的架构、框架、设计模式】相当于将原来位于UI层的业务逻辑处理下移到了BLL层
4.特征 优点:分离开发人员关注的内容;项目需求变化时,程序模组可以无损替换;提高代码的可复用性;
缺点:代码量大;实现复杂;
三、通用控制层的扩展 1.通用层的概念 用以复用一些共用技术,如:通用的辅助类和工具方法;数据校验方法;缓存处理、加密方法
以Common为标识
文章图片
四、接口与多态 1.软件设计中的接口 .Net中的接口定义规范:①使用关键字interface定义,接口类一般以 I 开头
②接口中的属性、方法只做声明而不具体实现
③均为public
文章图片
接口的实现
文章图片
特点:①接口具有强制性,实现接口的类必须实现接口的所有成员
②一个类即可以实现多个接口,也可以同时继承其他类
文章图片
2.应用多态实现多态 前提条件:①一个接口必须被 两个/以上 的类实现
②接口实现类必须转换成接口类型去使用
文章图片
与继承多态的比较
抽象类 | 接口 | |
异 | 使用abstract | 实用interface |
只能继承一个类 | 可以实现多个接口 | |
非抽象派生类必须实现抽象方法 | 实现接口的类必须实现所有成员 | |
使用override实现 | 直接实现 | |
同 | 都不能用于实例化 | |
都未包含实现方法 | ||
子类/“接口实现类”都必须实现为实现的方法 |
②抽象工厂(多找那个类型数据库访问问题/不同业务逻辑)
③单例模式(Web中设计购物车需要使用)
2.简单工厂
文章图片
原理:①工厂可以通过“选择”的方法来指定创建哪个“接口实现的类”
②工厂实际是一个对象创建的方法,让对象延迟创建(取代原来new的作用)
实现:①接口(产品原型)
②工厂类(产品生产)
文章图片
using System.Configuration;
//同时需要在项目中引用class Facotory
{
//1.定义接口变量
staitc IReport objReport = null;
//2.读取配置文件(添加App.config)
static string reportType = congfigurationManager.AppSettings["ReportType"].ToString();
//3.根据用户要求创建对象
public static IReport ChooseRepType()
{
switch(reportType)
{
case "ExcelReport":objReport = new ExcelReport();
break;
case "WordReport":objReport = new WordReport();
break;
}
return objReport;
}
}
③仓库(产品输出):具体的接口实现(多种实现)
在主程序中的调用
IReport objRep = Factory.ChooseRepType();
//工厂动态新建//等价于IReport objRep = new ExcelReport();
IReport objRep = new WordReport();
基于反射技术的简单工厂改进
文章图片
static string reportType = congfigurationManager.AppSettings["ReportType"].ToString();
public static IReport ChooseRepType()
{
return (IReport)Assembly.Load("UseFactory").CreateInstance("Report."+reportType);
}
3.抽象工厂设计模式 同时开发不同数据库访问的DAL,集成在一个系统中,根据用户的需求配置不同的DAL和UI、BLL结合即可
优势:只需要维护一套系统,维护和开发成本较低且部署灵活
设计DAL方案:(任选其一)
文章图片
BLL依赖“开关”与DAL隔离。
抽象工厂的依赖关系
文章图片
框架实现:DAL(接口实现)、IDAL(接口)、DALFactory(抽象工厂)互相独立
使用的配置文件:
文章图片
//DALFctory的实现//1.读取数据库类型
static dbType = configurationManager.AppSetting["dbType"].ToString();
//2.读取DAL所在的程序集名称
static dalAssemblyName = configurationManager.AppSetting["DalAssemblyName"].ToString();
//3.组合要创建的对象的命名空间
static string path = dalAssemblyName + "." + dbType;
//4.使用反射来实现
public static IDAL.IStudentService CreateStudentService()
{
return (IDAL.IStudentService)Assembly.Load(dalAssemblyName).CreateInstance(path + ".StudentService");
}
BLL中的引用:
public class ClassManager
{
//通过抽象工厂创建DAL,实现DAL动态替换
IDAL.IStuService objSer = DALFactory.DataAcess.CreateStuSerObj();
//抽象构造方法
public List GetAllStu()
{
return objStu.GetAllStu
}
}
六、反射技术 1.概念 通过反射,可以在运行时获得某个类型的各种信息,包括方法、属性、事件、构造函数等,还可以获取每个成员的名称等信息
反射是在程序运行时进行的(动态创建对象、调用方法、设置属性、激发事件),并非在编译时完成
2.应用 ①系统需要基于插件开发的时候,必须使用反射
②简单工厂&抽象工厂中将使用反射
③一般配合接口使用
④反射会降低系统性能,除非必要否则不宜过多使用
3.实现
using System.Reflection;
//引入反射命名空间
using ICal;
//引入接口库//动态加载程序集并创建对象
ICalculator objCal = (ICalculator)Assembly.LoadFrom("CalDLL.dll").CreateInstance("CalDLL.Calcuator");
//调用反射,需要引入类文件 + 完全限定名(同时返回的是Objcet型,需要强制转换)int Result = objCal.Add(num1,num2);
//通过接口运算
4.优势 使用反射后,不再需要添加接口实现类的引用,降低了模块之间的耦合,可以直接使用外部调用(随意替换文件)
推荐阅读
- C#通用框架|C#通用框架
- Elasticsearch|Elasticsearch(通过 JDBC 使用 SQL 来查询索引 - DBeaver)
- 微信小程序|毕业论文-基于微信小程序的图书馆管理系统设计与实现
- 微信小程序|微信小程序健康预约检查管理系统的开发与实现
- springBoot|SpringBoot中Excel的上传
- Java专题|【在线实习】推推项目课程介绍—小说更新就通知
- Android|2022年中高级 Android 大厂面试秘籍,为你保驾护航金九银十,直通大厂
- 后端|2022 年最新 Java 后端薪资统计出炉,看看你有没有拖后腿
- 前端|idea如何运行Java Web项目(Servlet、JSP)