• C#的架构、框架、设计模式


    建立层务必使用类库选项,不要使用文件夹(没错,说的就是我自己)

    一、两层架构

            1.架构概述

                    两层架构适合小型 / 中小型项目

    名称标识用途
    数据访问对象DAL模型服务,需要添加Models引用
    实体对象Models模型
    用户界面UI交互界面,需要添加DAL和Models引用

             2.实体对象的序列化

                    序列化:将对象状态转换为可保持/传输的格式,会转换为字节流

                    反序列化:将流转换为对象

                    实现:在类中加入可序列化标记[Serializable]

    二、三层架构

            1.架构概述

                    适合大 / 中型应用开发

             2.命名规范(通用)

             3.DAL与BLL

    1. //BLL
    2. publc class StudentManager
    3. {
    4. private StudentSeiver objStu = new StudentSeiver (); //创建数据访问对象
    5. public List GetAllStu()
    6. {
    7. return objStu.GetAllStu(); //仅起数据传递作用
    8. }
    9. public List GetStuByClass(string className)
    10. {
    11. if(className == null || className.lenght == 0)
    12. return objStu.GetStu();
    13. else
    14. return ibjStu.GetStuByClass(className); //根据不同查询条件实现数据访问
    15. }
    16. }

                    在主程序中,仅需调用BLL中的接口,而无需去处理DAL中的具体方法(进一步分离)

                    相当于将原来位于UI层的业务逻辑处理下移到了BLL层

            4.特征

                    优点:分离开发人员关注的内容;        项目需求变化时,程序模组可以无损替换;        提高代码的可复用性;

                    缺点:代码量大;        实现复杂;

    三、通用控制层的扩展

            1.通用层的概念

                    用以复用一些共用技术,如:通用的辅助类和工具方法;数据校验方法;缓存处理、加密方法

                    以Common为标识

     四、接口与多态

            1.软件设计中的接口

                    .Net中的接口定义规范:①使用关键字interface定义,接口类一般以 I 开头

                                                           ②接口中的属性、方法只做声明而不具体实现

                                                           ③均为public

                     接口的实现

                     特点:①接口具有强制性,实现接口的类必须实现接口的所有成员

                                ②一个类即可以实现多个接口,也可以同时继承其他类

             2.应用多态实现多态

                    前提条件:①一个接口必须被 两个/以上 的类实现

                                      ②接口实现类必须转换成接口类型去使用

                     与继承多态的比较

    抽象类接口
    使用abstract实用interface
    只能继承一个类可以实现多个接口
    非抽象派生类必须实现抽象方法实现接口的类必须实现所有成员
    使用override实现直接实现
    都不能用于实例化
    都未包含实现方法
    子类/“接口实现类”都必须实现为实现的方法

    五、设计模式

            1.概述

                    常见的设计模式:        ①简单工厂(单一对象创建的扩展)       

                                                         ②抽象工厂(多找那个类型数据库访问问题/不同业务逻辑)       

                                                          ③单例模式(Web中设计购物车需要使用)

            2.简单工厂

                     原理:①工厂可以通过“选择”的方法来指定创建哪个“接口实现的类”

                                ②工厂实际是一个对象创建的方法,让对象延迟创建(取代原来new的作用)

                    实现:①接口(产品原型)

                               ②工厂类(产品生产)

    1. using System.Configuration; //同时需要在项目中引用
    2. class Facotory
    3. {
    4. //1.定义接口变量
    5. staitc IReport objReport = null;
    6. //2.读取配置文件(添加App.config)
    7. static string reportType = congfigurationManager.AppSettings["ReportType"].ToString();
    8. //3.根据用户要求创建对象
    9. public static IReport ChooseRepType()
    10. {
    11. switch(reportType)
    12. {
    13. case "ExcelReport": objReport = new ExcelReport(); break;
    14. case "WordReport": objReport = new WordReport(); break;
    15. }
    16. return objReport;
    17. }
    18. }

                               ③仓库(产品输出):具体的接口实现(多种实现)

                    在主程序中的调用

    1. IReport objRep = Factory.ChooseRepType(); //工厂动态新建
    2. //等价于IReport objRep = new ExcelReport(); IReport objRep = new WordReport();

                    基于反射技术的简单工厂改进

    1. static string reportType = congfigurationManager.AppSettings["ReportType"].ToString();
    2. public static IReport ChooseRepType()
    3. {
    4. return (IReport)Assembly.Load("UseFactory").CreateInstance("Report."+reportType);
    5. }

            3.抽象工厂设计模式

                    同时开发不同数据库访问的DAL,集成在一个系统中,根据用户的需求配置不同的DAL和UI、BLL结合即可

                    优势:只需要维护一套系统,维护和开发成本较低且部署灵活

                    设计DAL方案:(任选其一)

                             BLL依赖“开关”与DAL隔离。

                    抽象工厂的依赖关系

                     框架实现DAL(接口实现)、IDAL(接口)、DALFactory(抽象工厂)互相独立

                             使用的配置文件:

    1. //DALFctory的实现
    2. //1.读取数据库类型
    3. static dbType = configurationManager.AppSetting["dbType"].ToString();
    4. //2.读取DAL所在的程序集名称
    5. static dalAssemblyName = configurationManager.AppSetting["DalAssemblyName"].ToString();
    6. //3.组合要创建的对象的命名空间
    7. static string path = dalAssemblyName + "." + dbType;
    8. //4.使用反射来实现
    9. public static IDAL.IStudentService CreateStudentService()
    10. {
    11. return (IDAL.IStudentService)Assembly.Load(dalAssemblyName).CreateInstance(path + ".StudentService");
    12. }

                   BLL中的引用

    1. public class ClassManager
    2. {
    3. //通过抽象工厂创建DAL,实现DAL动态替换
    4. IDAL.IStuService objSer = DALFactory.DataAcess.CreateStuSerObj();
    5. //抽象构造方法
    6. public List GetAllStu()
    7. {
    8. return objStu.GetAllStu
    9. }
    10. }

    六、反射技术

            1.概念

                    通过反射,可以在运行时获得某个类型的各种信息,包括方法、属性、事件、构造函数等,还可以获取每个成员的名称等信息

                    反射是在程序运行时进行的(动态创建对象、调用方法、设置属性、激发事件),并非在编译时完成

            2.应用

                    ①系统需要基于插件开发的时候,必须使用反射

                    ②简单工厂&抽象工厂中将使用反射

                    ③一般配合接口使用

                    ④反射会降低系统性能,除非必要否则不宜过多使用

            3.实现

    1. using System.Reflection; //引入反射命名空间
    2. using ICal; //引入接口库
    3. //动态加载程序集并创建对象
    4. ICalculator objCal = (ICalculator)Assembly.LoadFrom("CalDLL.dll").CreateInstance("CalDLL.Calcuator");
    5. //调用反射,需要引入类文件 + 完全限定名(同时返回的是Objcet型,需要强制转换)
    6. int Result = objCal.Add(num1,num2); //通过接口运算

            4.优势

                    使用反射后,不再需要添加接口实现类的引用,降低了模块之间的耦合,可以直接使用外部调用(随意替换文件)

  • 相关阅读:
    第三章:什么是分库分表
    mysql监控sql执行情况
    GID:旷视提出全方位的检测模型知识蒸馏 | CVPR 2021
    idea中把spring boot项目打成jar包
    临近期末,这些题不来看看吗?(上)
    【Bootstrap】bootstrap入门之Scss知识点详解_03
    以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化
    测试人生 | 毕业2年,拒绝独角兽入职名企大厂涨薪10万+,这个95后小姐姐好飒
    Android:WebView使用常见问题汇总(持续更新)
    企业架构LNMP学习笔记20
  • 原文地址:https://blog.csdn.net/weixin_37878740/article/details/126049127