ASP.NET8.0入门与实战

1、项目初始化

创建一个ASP.NET Core Web API的项目,取消Https和身份验证。

API项目实际上是一个控制台程序,这点可以在项目的属性的输出类型中看到。

launchSettings.json,在这里可以配置运行项目的名称,端口号,路径等。

在Program.cs文件中对项目的构造器和中间件进行了配置,首先是创建构造器,添加控制器,终结点,Swagger,构建构造器。在中间件模块里首先是判断是否是开发模式,如果是的话便开始注册Swagger和它的UI界面,授权,路由映射。

最后是运行项目,在Swagger中调用接口可以看到返回值,如果是简单的项目比如一个只有OCR功能的项目是不需要另外再创建其他项目的,除非是一个比较复杂的才需要创建多个层级的项目。

2、仓储+服务架构模式讲解

这一节开始搭建项目,搭建项目很重要,会影响日常开发和维护的流程,这里采用的是这种架构:

1、接口层(控制器)暴露在最外面,由它去调用服务层;

2、服务层是个中转站,它会去调用仓储层拿到数据库实体,并映射为数据模型对象Vo,这里的Vo应该与仓储层的数据库实体有差异,避免暴露一些关键信息,比如隐藏ID,修改字段名;另外一个好处是假如数据库的数据做了迁移,需要修改字段名,只需要修改数据实体即可,无需修改Vo,前端是不用动的,减少了开发量。

3、仓储层与数据库做交互,拿到数据库实体,它也会去调用公共层的代码,现在在底层引用了一个类库后,引用它的项目的引用的项目也能使用这个类库,就很方便不用重复引用了,而且避免出现不同的版本。

还有就是在服务层和仓储层都定义了一套实现类与接口类,设计到延迟的功能都使用了异步和等待。

Mock了一个数据 = 造假数据,具体来说就是将定义好的数据写到程序中,作为固定返回,C#中有专门做假数据的类库。

3、泛型基类的妙用

这一节在仓储层和服务层定义了一对抽象化的类与接口,IBaseRepository和BaseRepository,通过往里面传入泛型的方式简化了类和接口的创建,但这样写是无法处理复杂的业务逻辑的。

    public interface IBaseRepository<TEntity> where TEntity : class{Task<List<TEntity>> Query();}

    public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class, new(){public async Task<List<TEntity>> Query(){await Task.CompletedTask;var str = "[{\"Id\":1, \"Name\":\"李四\"}]";var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<TEntity>>(str) ?? new List<TEntity>();return list;}}

4、泛型对象的关系映射

由于上一节最终返回的是一个数据模型而不是视图模型,所以需要用到AutoMapper让两种类型实现一次配置后自动转换。

具体步骤:

1、下载Nuget包,AutoMapper 12.0.1,AutoMapper.Extensions.Microsoft.DependencyInjection 12.0.0

2、创建配置文件CustomProfile,可以看到里面是对两个类里面属性的一个映射,CreateMap的第一个是起始类Role,第二个是目标类RoleVo,值得注意的是ForMember的第一个参数却是目标类RoleVo的属性RoleName,第二个参数是起始类Role的属性

    public class CustomProfile : Profile{public CustomProfile(){CreateMap<Role, RoleVo>().ForMember(a => a.RoleName, o => o.MapFrom(d => d.Name));CreateMap<RoleVo, Role>().ForMember(a => a.Name, o => o.MapFrom(d => d.RoleName));}}

另外还需要创建一个AutoMapper的配置文件AutoMapperConfig,这个在后面的注入环节会用到。

3、在Program的Main函数中对AutoMapper进行构建

    builder.Services.AddAutoMapper(typeof(AutoMapperConfig));AutoMapperConfig.RegisterMappings();

然后在服务层使用它,这里需要进行依赖注入,然后使用AutoMapper的Map方法,泛型是目标类,入参是起始类。

    public class BaseService<TEntity, TVo> : IBaseService<TEntity, TVo> where TEntity : class, new(){public readonly IMapper _mapper;public BaseService(IMapper mapper){_mapper = mapper;}public async Task<List<TVo>> Query(){var baseRepository = new BaseRepository<TEntity>();var entities = await baseRepository.Query();return _mapper.Map<List<TVo>>(entities);}}

5、依赖注入

虽然使用依赖注入需要进行额外的配置,但好处多多,比如不用担心内存泄漏,何时被GC回收。

在Main函数中对创建的类进行注册有三种模式:Singleton、Scoped、Transient

Singleton可以理解为单例模式,只有一个实例,是全局的。

Scoped可以理解为在一次请求中用到的是同一个实例,例如:在一个Action中,如果两次用到同一个实例,在这种模式下将会是相同的。

Transient可以理解为瞬时的,例如::在一个Action中,如果两次用到同一个实例,在这种模式下将会是不同的。

最常用的还是Scoped模式,在ASP.NET中在Action中使用new关键字创建的对象的时候也是这种方式。

ASP.NET Core和ASP.NET一个很明显的区别就在于应尽量避免去new一个对象,而是通过依赖注入来获得它。

具体步骤:

1、在Main函数注入服务类

builder.Services.AddScoped(typeof(IBaseService<,>), typeof(BaseService<,>));

2、在Controller中通过构造函数拿到它,然后在Action中使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Synopsys 逻辑综合的整体架构概览

目录 一、DC Shell 逻辑综合的整体架构概览 ⛓️ 逻辑综合的主要阶段&#xff08;Pipeline&#xff09; 二、核心架构模块详解 1. Internal Database&#xff08;设计对象数据库&#xff09; 2. Scheduler&#xff08;调度器&#xff09; 3. Rewriting Engine&#xff08…

低压电工常见知识点

一.工厂用电 1.工厂一般有电源380V和220V。 三相:黄绿红 蓝 双色 助记符:王力宏 分别对应第一相(R),第二相(S)&#xff0c;第三相(T)&#xff0c;零线(N),地线(PE) 单相:红 黑 对应火线(L) 零线(N) 左零右火 二.人体安全电压是36V 三.变压器的讲解 变压器的符号…

【沉浸式求职学习day27】

沉浸式求职学习 家人们谁懂啊&#xff01;明天下午又实习笔试了&#xff0c;所以今天大部分时间还是在搞一些行测之类的东西&#xff0c;所以今天没什么分享给大家的&#xff0c;明晚会简单的和大家分享一下关于数据库的一些东西&#xff0c;以及和大家聊聊我笔试的感觉哈哈哈哈…

进入救援模式(物理服务器)

目录 **📌 准备工作****🚀 进入救援模式(物理服务器)****方法 1:直接修改启动参数****适用情况****操作步骤****方法 2:通过GRUB引导菜单进入(系统未完全崩溃时)****适用情况****操作步骤****两者的核心区别****如何选择?****注意事项****总结**当物理服务器无法正常…

基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、基于pytest单元测试框架的规则 1.1 模块名&#xff08;即文件名&#xff09;必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用…

汇总 JavaScript 内置对象常用方法详解

汇总 JavaScript 内置对象常用方法详解 JavaScript 提供了许多强大的内置对象&#xff0c;它们带有各种实用的方法&#xff0c;能够帮助我们更高效地编写代码。本文将介绍最常用的内置对象方法&#xff0c;并通过实例展示它们的使用场景。 目录 Array 数组String 字符串Obje…

OceanBase TPCC测试常见报错汇总

OceanBase TPCC测试常见报错汇总 报错1:加载测试数据时创建tablegroup失败报错2:加载测试数据时执行超时报错3:加载测试数据时funcs.sh函数找不到报错4:加载数据时报错超过租户内存上限办法一:增加租户内存办法二:调高转储线程数办法三:调整MemStore内存占比和冻结触发阈…

Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素

近日&#xff0c;在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 语法&#xff0c;该语法糖可以用于在 List、Set、Map 等集合中处理可能为 null 的元素或键值对&#xff0c;简化显式检查 null 的场景&#xff1a; /之前 var listWithoutNullAwareElements [if …

SAIL-RK3588协作机器人运动控制器技术方案

一、核心能力与政策适配‌ ‌政策合规性‌ 满足工信部《智能机器人重点技术攻关指南》要求&#xff0c;支持 ‌EtherCAT主站协议&#xff08;符合IEC 61158标准&#xff09;‌&#xff0c;助力企业申报工业机器人研发专项补贴&#xff08;最高300万元/项目&#xff09;‌核心板…

Eigen几何变换类 (Transform, Quaternion等)

1. Transform 类&#xff1a;仿射/射影变换 模板参数 cpp Transform<Scalar, Dim, Mode, Options> Scalar&#xff1a;数据类型&#xff08;如 float, double&#xff09;。 Dim&#xff1a;维度&#xff08;2 或 3&#xff09;。 Mode&#xff1a;变换类型&#xf…

openGauss手工配置主备

1、初始化 创建一个操作系统用户&#xff0c;例如postgres&#xff0c;为这个用户设置PATH和LD_LIBRARY_PATH环境变量&#xff0c;指向opengauss/bin和opengauss/lib export GAUSSHOME/mnt/disk01/opengauss export PATH$GAUSSHOME/bin:$PATH export LD_LIBRARY_PATH$GAUSS…

CSS预处理器对比:Sass、Less与Stylus如何选择

引言 CSS预处理器已成为现代前端开发的标准工具&#xff0c;它们通过添加编程特性来增强纯CSS的功能&#xff0c;使样式表更加模块化、可维护且高效。在众多预处理器中&#xff0c;Sass、Less和Stylus是三个最流行的选择&#xff0c;它们各自拥有独特的语法和功能特点。本文将深…

基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述

以下是基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述,使用文本和Mermaid语法表示: 架构图(Mermaid语法) #mermaid-svg-WWCAqL1oWjvRywVJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WWCAq…

js中get,set用法

1、作为对象的访问器属性 //使用Object.definePropertylet obj {_a:123};Object.defineProperty(obj, "a", {get() {return this._a;},set(val) {this._aval},});console.log(obj.a); //123obj.a456console.log(obj.a) // 456 //使用对象字面量let obj {_a:123,ge…

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

Steam游戏服务器的DDoS攻防体系设计&#xff0c;从协议层漏洞利用到业务连续性保障&#xff0c;深度拆解反射型攻击、TCP状态耗尽等7类威胁场景。基于全球15个游戏厂商攻防实战数据&#xff0c;提供包含边缘节点调度、AI流量指纹识别、SteamCMD加固配置的三维防护方案&#xff…

【AI】SpringAI 第四弹:接入本地大模型 Ollama

Ollama 是一个开源的大型语言模型服务工具。它的主要作用是帮助用户快速在本地运行大模型&#xff0c; 简化了在 Docker 容器内部署和管理大语言模型&#xff08;LLM&#xff09;的过程。 1. 确保Ollama 已经启动 # 查看帮助文档 ollama -h# 自动下载并启动 ollama run deeps…

大语言模型的评估指标

目录 一、混淆矩阵 1. 混淆矩阵的结构&#xff08;二分类为例&#xff09; 2.从混淆矩阵衍生的核心指标 3.多分类任务的扩展 4. 混淆矩阵的实战应用 二、分类任务核心指标 1. Accuracy&#xff08;准确率&#xff09; 2. Precision&#xff08;精确率&#xff09; 3. …

SpringBoot Gradle插件:构建与打包配置

文章目录 引言一、Spring Boot Gradle插件基础二、依赖管理与配置三、应用打包配置四、启动脚本与运行配置五、多环境构建与配置六、集成Docker与云原生支持七、实践案例&#xff1a;自定义Spring Boot应用构建总结 引言 在Java生态系统中&#xff0c;Gradle作为一种灵活且强大…

Vue3 组件通信与插槽

Vue3 组件通信方式全解&#xff08;10种方案&#xff09; 一、组件通信方式概览 通信方式适用场景数据流向复杂度Props/自定义事件父子组件简单通信父 ↔ 子⭐v-model 双向绑定父子表单组件父 ↔ 子⭐⭐Provide/Inject跨层级组件通信祖先 → 后代⭐⭐事件总线任意组件间通信任…

【KWDB 创作者计划】_嵌入式硬件篇---数字电子器件

文章目录 前言一、系列前缀(如 "74" 或 "54")74(商用级)54(工业级)二、逻辑家族(如 "LS"、"HC"、"HCT" 等)TTL(晶体管-晶体管逻辑)家族CMOS(互补金属氧化物半导体)家族BiCMOS(双极 CMOS)家族三、功能编号(如…