Wpf 使用 Prism 实战开发Day14

备忘录接口增删(CURD)改查实现


一.添加备忘录控制器(MemoController)

备忘录控制器(MemoController)和待办事项控制器 (ToDoController)功能实现差不多一样。基本套路就是:

  1. 定义控制器(Controller)
  2. 定义数据传输层(Dto)
  3. 配置实体类(Entity)和数据传输类(Dto) 关系映射(Auto Mapper)
  4. 定义服务接口(IService)
  5. 实现服务接口 (Service)
  6. 把服务注入控制器中使用
  7. 最后在 Program.cs 进行依赖注入

1.在 MyToDo.Api 项目Controllers文件夹中,定义(MemoController)备忘录控制器

    /// <summary>/// 备忘录控制器/// </summary>[ApiController][Route("api/[controller]/[action]")]public class MemoController : ControllerBase{}

2.在 MyToDo.Shared 项目Dtos文件夹中,定义(MemoDto)备忘录数据传输层

    /// <summary>/// 备忘录数据传输实体/// </summary>public class MemoDto : BaseDto{private string title;private string content;public string Title{get { return title; }set { title = value; OnPropertyChanged(); }}public string Content{get { return content; }set { content = value; OnPropertyChanged(); }}}

3.在MyToDo.Api  项目 Extensions 文件夹的 AutoMapperProFile 类中配置Auto Mapper

    public class AutoMapperProFile:MapperConfigurationExpression{public AutoMapperProFile(){/// 实体类和数据传输类进行映射CreateMap<ToDo, ToDoDto>().ReverseMap();CreateMap<Memo, MemoDto>().ReverseMap();}}

4.在MyToDo.Api 项目Service 文件夹中,定义备忘录服务接口(IMemoService)

    public interface IMemoService: IBaseService<MemoDto>{}

5.同样,在MyToDo.Api 项目Service 文件夹中,实现(MemoService)备忘录服务接口

/// <summary>
///备忘录的实现
/// </summary>
public class MemoService : IMemoService
{private readonly IUnitOfWork work;private readonly IMapper mapper;public MemoService(IUnitOfWork work,IMapper mapper){this.work = work;this.mapper = mapper;}public async Task<ApiResponse> AddAsync(MemoDto model){try{var doto= mapper.Map<Memo>(model);//进行数据映射转换await work.GetRepository<Memo>().InsertAsync(doto);if (await work.SaveChangesAsync() > 0) //保存成功{return new ApiResponse(true, model); //返回true,并把添加的实体返回}return new ApiResponse("添加数据失败");}catch (Exception ex){return new ApiResponse(ex.Message);}}public async Task<ApiResponse> DeleteAsync(int id){try{var repository= work.GetRepository<Memo>();//获取仓储//删除之前,先进行查询var todo = await repository.GetFirstOrDefaultAsync(predicate:x=>x.Id.Equals(id));repository.Delete(todo);if (await work.SaveChangesAsync() > 0) //删除成功{return new ApiResponse(true, "删除成功"); }return new ApiResponse("删除数据失败");}catch (Exception ex){return new ApiResponse(ex.Message);}}public async Task<ApiResponse> GetAllAsync(){try{var todos= await work.GetRepository<Memo>().GetAllAsync();return new ApiResponse(true, todos); //返回true,并返回所有数据}catch (Exception ex){return new ApiResponse(ex.Message);}}public async Task<ApiResponse> GetSingleAsync(int id){try{var todo= await work.GetRepository<Memo>().GetFirstOrDefaultAsync(predicate: x => x.Id.Equals(id));return new ApiResponse(true, todo); //把找到的数据返回}catch (Exception ex){return new ApiResponse(ex.Message);}}public async Task<ApiResponse> UpdateAsync(MemoDto model){try{var dbdoto = mapper.Map<Memo>(model);var repository = work.GetRepository<Memo>();//获取仓储//更新之前,先拿到要更新的数据var todo = await repository.GetFirstOrDefaultAsync(predicate: x => x.Id.Equals(dbdoto.Id));todo.Title = dbdoto.Title;todo.Content = dbdoto.Content;todo.UpdateDate = DateTime.Now;repository.Update(todo);if (await work.SaveChangesAsync() > 0) //更新成功{return new ApiResponse(true, "更新成功");}return new ApiResponse("更新数据失败");}catch (Exception ex){return new ApiResponse(ex.Message);}}
}

6.接着,在 MemoController 控制器中注入并使用IMemoService 服务

    /// <summary>/// 备忘录控制器/// </summary>[ApiController][Route("api/[controller]/[action]")]public class MemoController : ControllerBase{private readonly IMemoService service;public MemoController(IMemoService service){this.service = service;}[HttpGet]public async Task<ApiResponse> Get(int id) => await service.GetSingleAsync(id);[HttpGet]public async Task<ApiResponse> GetAll() => await service.GetAllAsync();[HttpPost]public async Task<ApiResponse> Add([FromBody] MemoDto model) => await service.AddAsync(model);[HttpPost]public async Task<ApiResponse> Update([FromBody] MemoDto model) => await service.UpdateAsync(model);[HttpDelete]public async Task<ApiResponse> Delete(int id) => await service.DeleteAsync(id);}

7.最后,在 Program.cs 中注入 IMemoService 服务

builder.Services.AddTransient<IMemoService, MemoService>();


二.高级查询实现

根据传入的条件进行分页查询。

1.在MyToDo.Shared 项目中,创建通用的查询实体类(QueryParameter)

    public class QueryParameter{/// <summary>///  页数/// </summary>public int PageIndex { get; set; }/// <summary>///  总数/// </summary>public int PageSize { get; set; }/// <summary>/// 查询条件/// </summary>public string? Search { get; set; }}

2.改造 IBaseService 基类服务接口,传入通用查询实体类(QueryParameter)


3.在备忘录或待办事项接口服务实现层,去改造实现高级查询逻辑

例如:MemoService 服务实现层,改造GetAllAsync 查询接口

        public async Task<ApiResponse> GetAllAsync(QueryParameter query){try{var todos = await work.GetRepository<Memo>()//根据标题查,如果传过来的Search 为空,直接过。否则就匹配标题。.GetPagedListAsync(predicate: x => string.IsNullOrWhiteSpace(query.Search) ? true : x.Title.Equals(query.Search),pageIndex: query.PageIndex,pageSize: query.PageSize,orderBy:source=>source.OrderByDescending(t=>t.CreateDate) //根据创建时间进行排序);return new ApiResponse(true, todos); //返回true,并返回所有数据}catch (Exception ex){return new ApiResponse(ex.Message);}}

4.最后,修改备忘录(MemoController)控制器和待办事项(ToDoController)控制器 GetAll 方法的参数传入。

[FromQuery] 特性作用:将查询字符串参数值绑定到对应的 QueryParameter 参数上

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

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

相关文章

写点东西《JavaScript 中的递归》

写点东西《JavaScript 中的递归》 您是否曾经发现自己需要在 JavaScript 中循环遍历一个复杂的多维对象&#xff0c;却不知道如何操作&#xff1f; 那么&#xff0c;递归函数到底是什么&#xff1f; 让我们回到我们的树对象。 为什么使用递归&#x1f31f;更多精彩 您是否曾经发…

京东按关键字搜索商品 API(item_search-按关键字搜索商品-onebound.jd.item_search)

京东提供了API接口供开发者进行商品搜索。要使用这个API&#xff0c;首先需要去京东开放平台注册一个账号并创建一个应用&#xff0c;然后获取到应用的API密钥。 关于按关键字搜索商品的API接口&#xff0c;京东开放平台提供了item_search这个接口。以下是这个接口的基本使用方…

LabVIEW工业机器人系统

介绍了ABB工业机器人与LabVIEW之间进行数据交互的解决方案。通过使用TCP/IP协议的socket通信&#xff0c;实现了机器人坐标数据的读取&#xff0c;为人机交互提供了一个更便捷、更高效的新思路。 系统主要由ABB工业机器人、基于TCP/IP协议的通信接口和LabVIEW软件组成。工业机…

鸿蒙常用UI效果及一些处理方式总结

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 详细使用介绍 1、Text的一些常用设置 Text(this.message).fontSize(50)//字体大小.fontColor(Color.White)//字体颜色.fontWeight(FontWeight.Bold)//字体加粗.backgroundColor(Color.Black)//背景颜色.fontStyle(…

【Java】小白友好的Servlet基础学习笔记

后面比赛挺多&#xff0c;RW体验赛&#xff0c;西湖论剑&#xff0c;beginCTF&#xff0c;N1CTF&#xff0c;hgame&#xff0c;NSS新春赛&#xff0c;NSS Round17&#xff0c;SICTF&#xff0c;有观赏性大于操作性的&#xff0c;有萌新可以真正去打的。经过慎重考虑&#xff0c…

[安全警报] Npm木马利用“Oscompatible“包悄然安装AnyDesk

最近&#xff0c;一个名为OsCompatible的恶意包被上传到npm 。该包被发现包含一个针对 Windows 的远程访问木马。 这个名为OsCompatible的软件包于2024年1月9日发布&#xff0c;在被撤下之前共吸引了380次下载。 据了解&#xff0c;OsCompatible包含“几个奇怪的二进制文件”…

Linux本地部署MeterSphere测试平台并实现公网远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

MySQL中的ON DUPLICATE KEY UPDATE语句详解

前言 在MySQL数据库中&#xff0c;INSERT INTO ... ON DUPLICATE KEY UPDATE 是一个强大的SQL语句&#xff0c;它结合了插入新记录和更新已存在记录的功能于一体。这种机制在处理唯一键约束时尤为有用&#xff0c;能够避免因尝试插入重复主键或唯一键值而产生的错误&#xff0…

重学JavaScript高级(十五): XHR以及Fetch的理解应用

JavaScript XHR、Fetch 服务器端渲染-前后端分离 **服务器端渲染&#xff1a;**将html文件在后端&#xff0c;拼接好&#xff0c;将整个文件全部返回给前端 随着目前业务逻辑的复杂度提升&#xff0c;这种开发模式&#xff0c;会导致效率低下同时&#xff0c;有时候前端页面仅…

SQL语句 - 查询语句

Data Query Language 文章目录 Data Query Language数据查询&#xff08;DQL&#xff09;基础查询1 基本查询2 排序查询3 条件查询4 分支结构查询5 查询函数6 分组查询7 分组过滤查询8 限定查询9 基础查询总结 面试题&#xff1a;一条SQL查询语句的执行流程高级查询1 子查询2 合…

linux基础学习(7):find命令

1.按照文件名搜索 find 搜索路径 选项 文件名 选项&#xff1a; -name&#xff1a;按文件名搜索 -ineme&#xff1a;不区分文件名大小写搜索 -inum&#xff1a;按inode号搜索 按文件名搜索跟按关键词搜索不一样&#xff0c;只能搜到文件名完整对应的文件 *根据文件名…

Future,RunnableFuture,FutureTask学习

Future接口 public interface Future<V> {//取消任务执行 //当任务还没有启动&#xff0c;返回ture//当任务正在运行中&#xff0c;会根据mayInterruptIfRunning参数决定是否中断当前运行的线程来取消当前运行的任务//当任务已经完成或异常&#xff0c;其他一些原因不能…

PyTorch的衍生资源

PyTorch作为深度学习领域的一个重要框架&#xff0c;自2016年首次发布以来经历了显著的发展。以下是PyTorch发展过程中的几个关键里程碑事件&#xff1a; 2016年&#xff1a; PyTorch于2016年首次发布&#xff0c;作为一个基于动态计算图的开源机器学习库&#xff0c;它提供了自…

电磁波的空间辐射的几种传输形式

一般来说&#xff0c;波的传播方式与波长有关&#xff0c;如低频段的地波传播&#xff0c;极低频段的地—电离层波导传播&#xff0c;短波段的天波传播&#xff0c;甚高频&#xff0c;超高频的直线传播和散射传播方式等。绕射和透射是电磁波传输特性与环境的关系&#xff0c;属…

利用 Token Explorer 信号驾驭市场波动

市场波动使加密货币投资组合面临风险&#xff0c;但是通过 Token Explorer 分析&#xff0c;我们可以对波动进行建模&#xff0c;提前预测市场风险&#xff0c;并找到最安全的投资策略。通过综合考虑 Token 价格、交易量、社交媒体信息和链上交易等各种数据&#xff0c;我们可以…

Docker安装MySQL教程分享(附MySQL基础入门教程)

docker安装MySQL Docker可以通过以下命令来安装MySQL容器&#xff1a; 首先确保已经在计算机上安装了Docker。如果没有安装&#xff0c;请根据操作系统的不同进行相应的安装。 打开终端或命令提示符&#xff0c;并运行以下命令拉取最新版本的MySQL镜像&#xff1a; docker pu…

【转载】linux摄像头驱动

Linux摄像头驱动学习第一篇&#xff0c;对虚拟视频驱动Virtual Video Driver(vivid)进行测试、分析、编写。 V4L2(Video for Linux two)是Linux内核中关于视频设备的内核驱动框架&#xff0c;为上层的访问底层的视频设备提供了统一的接口。 V4L2可以支持多种设备,它可以有以下…

【进入游戏行业选游戏特效还是技术美术?】

进入游戏行业选游戏特效还是技术美术&#xff1f; 游戏行业正处于蓬勃发展的黄金时期&#xff0c;科技的进步推动了游戏技术和视觉艺术的飞速革新。在这个创意和技术挑战交织的领域里&#xff0c;游戏特效和技术美术岗位成为了许多人追求的职业目标。 这两个岗位虽然紧密关联…

开始读 Oracle PL/SQL Programming 第6版

最近觉得PL/SQL越来越重要&#xff0c;因为这本书早就在待读列表中&#xff0c;因此决定系统的学一下。 2024年1月24日晚开始读。 在亚马逊上的评价还不错&#xff1a; 本书的第一作者是Steven Feuerstein&#xff0c;是Oracle资深的Developer Advocate。 本书的示例代码可…

vue中如何写过滤器

全局注册 (可以在main.js中进行全局注册 vue.fifler(test’&#xff0c;function(v){return v0? ‘终止’&#xff1a;v1?进行中:异常 })在组件页面使用 <view>{{state|test}}</view> <script> export default {data(){return {state: 1// state 1 进行中…