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

2023-11-12

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

一、两层架构

        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<Student> GetAllStu()
    {
        return objStu.GetAllStu();    //仅起数据传递作用
    }

    public List<Student> GetStuByClass(string className)
    {
        if(className == null || className.lenght == 0)
            return objStu.GetStu();
        else
            return ibjStu.GetStuByClass(className);    //根据不同查询条件实现数据访问
    }
}

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

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

        4.特征

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

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

三、通用控制层的扩展

        1.通用层的概念

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

                以Common为标识

 四、接口与多态

        1.软件设计中的接口

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

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

                                                       ③均为public

                 接口的实现

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

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

         2.应用多态实现多态

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

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

                 与继承多态的比较

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

五、设计模式

        1.概述

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

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

                                                      ③单例模式(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<Stu> 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.优势

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#的架构、框架、设计模式 的相关文章

随机推荐

  • 基于stm32的智能防疫门禁管理系统

    1 选题背景与意义 经过了疫情的开端与发展 就目前我国已经处在疫情的常态化管理中 在疫情常态化管理下 与人们日常生活中的出行 总离不开测温 通行证明等等 针对当前的疫情形式 我们设计一款智能防疫门禁管理系统 它能实现人们出行中测温的无人化和
  • opencv3+python3.5成语填字游戏(二)填字图片汉字提取和识别

    上一篇说的是汉字的分割 今天该实际填字图片的解析了 实际图片如下 这是一个10 10的方格 所以我们应该先提取100个小方格 然后在提取其中的汉字 用到的函数主要是python的opencv函数库里的findContours函数 用于找出图
  • Python的multiprocessing连接池

    author skate time 2014 10 13 Python的multiprocessing连接池 root skatedb55 more pool2 py usr bin env python encoding UTF 8 Au
  • the importance of a sense of community responsibility(六级真题批改网90分)

    What proves universally acknowledged is that a sense of community has caused widespread pubic attention Undoubtedly comm
  • 跨省市跳槽,社保公积金处理办法

    文章目录 前言 五险一金断缴行为分析 1 养老保险 2 医疗保险 3 工伤 失业 生育保险 4 公积金 一 方案一 二 方案二 三 方案三 总结 前言 跨省市跳槽五险一金总共有三种处理办法 此处以 武汉跳槽深圳举例 1 直接放弃武汉账户不管
  • 笔记本玩逆水寒服务器未响应,运行逆水寒电脑崩溃怎么办_逆水寒运行游戏时电脑崩溃问题解决指引_游戏吧...

    部分笔记本在运行逆水寒游戏时会出现崩溃现象 许多玩家都不知道该怎么办 如何解决这个问题 下面玩家宝宝们就和游戏吧小编一起来看一看 逆水寒 运行游戏时电脑崩溃问题解决指引吧 逆水寒 运行游戏时电脑崩溃问题解决指引 亲爱的自在同门大家好 近日
  • Android native 层用OpenGL ES在屏幕模拟流水灯

    Android native 层用OpenGL ES在屏幕模拟流水灯 Native C开发OpenGL 源码实现如下 Native C开发OpenGL 参照Android开机动画 自己实现了在native层模拟led流水灯的代码 Andro
  • matinal:SAP 批量修改主数据(客户、供应商、物料)【给所有SAP业务顾问】

    TCODE MASS 对于批量修改主数据如客户 供应商等 可以试用一下Mass 它所能修改的范围如下 选定要修改的对象后 点击运行 会要求选择需要修改的表和字段 然后填写过滤出要修改数据的条件 随后会显示所有需要修改的数据 可以在下方表格里
  • C++字符串的查找

    关于字符串的各种查找 原文出处 https www cnblogs com yongpan p 7920165 html 1 find函数 在字符串中查找子字符串中出现的位置 函数最终返回的是子字符串出现在字符串中的起始下标 该函数有两个参
  • NLP之BERT和GPT

    NLP之BERT和GPT杂谈 我们介绍了好几种获取句子表征的方法 然而值得注意的是 我们并不是只对如何获取更好的句子表征感兴趣 在评估他们各自模型性能的时候所采取的方法 回过头去进行梳理 发现 无论是稍早些的 InferSent 还是 20
  • musescore 构建入门

    musescore 1 QT上面开发 2 Qt由于版本更新 更新到QT6了 构建器由qmake 更换到cmake musescore 在QT是用cmake 构建桌面软件包 3 底层依赖库 几乎都是音频相关的库 下面是windows 系统下面
  • 求无冲突矢量集合

    在PRNET中 i发送的分组能被j正确接收的充要条件是 1 存在i j的链路 2 当i发送时 没有其他节点k发送 即不存在k j 广播形式的也算 3 i发给j时 j只处于接收状态 即j不能发给其他节点 除了上述这些原则 还有一些在做题的时候
  • Linux Ubuntu apt-get安装mysql

    自从转前端以后好久都没有和数据库打过交道了 最近在写一个node项目需要用到mysql 但是又不想在本地安装数据库 就想着在云服务器上安装了 网上百度了安装方法 大多都是去mysql官网下载官方编译好的二进制文件 这个至少都是几百M大小的安
  • 用BeanFactoryAware接口,用BEAN的名称来获取BEAN对象

    用BeanFactoryAware接口 用BEAN的名称来获取BEAN对象 applicationContext beans xml
  • Docker----Dockerfile中执行pip install 命令报 Failed to establish a new connection 错误的解决办法

    原文链接 Docker Dockerfile中执行pip install 命令报 Failed to establish a new connection 错误的解决办法 问题 在Dockerfile文件中通过RUN pip install
  • 计算机视觉2021年3月28最新论文

    编辑 AI速递 计算机视觉 3月28日 1 USB Universal Scale Object Detection Benchmark 标题 USB 万能物体检测基准 链接 https arxiv org abs 2103 14027 2
  • Connected to the target VM, address:XXXX, transport: socket

    问题 1 Connected to the target VM address 127 0 0 1 65604 transport socket 排查方案 我是最近半年多次遇到这个问题 这个就是用debug模式启动程序 方便调试 运行一半直
  • Ablation Study消融研究

    作者 飘哥 链接 https www zhihu com question 291655038 answer 683038545 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 术语 消融研究 通常用于神经网
  • Python解释器验证器工具类

    需求背景 现需要实现一个工具类 功能为验证给定路径是否为有效的 Python 解释器可执行文件 不一定是主程序所使用的解释器 并获取该解释器版本信息 是否安装某模块 包等信息 该工具类将赋予主程序类似 PyCharm 中选取 Python
  • C#的架构、框架、设计模式

    建立层务必使用类库选项 不要使用文件夹 没错 说的就是我自己 一 两层架构 1 架构概述 两层架构适合小型 中小型项目 名称 标识 用途 数据访问对象 DAL 模型服务 需要添加Models引用 实体对象 Models 模型 用户界面 UI