当前位置: 首页 > news >正文

Wpf 使用 Prism 实战开发Day13

配置 AutoMapper 关系映射

在上一节 ToDoController 控制器,或 IToDoService 服务接口中,方法的传参都是直接传的实体类。但在实际开发过程中,这样是不允许的。标准且规范的做法是,定义一个数据传输层,即Dto层。


 一.在MyToDo.Api 项目中安装 Auto Mapper


二. 在MyToDo.Shared 项目中创建一个Dtos文件夹,存放Dto文件

1. 创建 BaseDto 基类,用于存放共用属性。

    public class BaseDto{public int Id { get; set; }}

2. 创建待办事项 Dto类,并继承自 BaseDto 基类 

    /// <summary>/// 待办事项数据实体/// </summary>public class ToDoDto:BaseDto{public string Title { get; set; }public string Content { get; set; }public int Status { get; set; }}

3.由于我们的客户端是Wpf 项目,各属性需要实现通知绑定 。所以 BaseDto类需要进行修改,并且要继承自 INotifyPropertyChanged 接口。同时还要实现一个通知绑定的方法。

    public class BaseDto:INotifyPropertyChanged{public int Id { get; set; }public event PropertyChangedEventHandler? PropertyChanged;/// <summary>/// CallerMemberName 是一个自动获取传入名称的属性/// </summary>/// <param name="propertyName"></param>public void OnPropertyChanged([CallerMemberName] string propertyName = ""){PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));}}

4.接着,要需要再修改 ToDoDto ,让它具备实现属性绑定通知功能。

  /// <summary>/// 待办事项数据实体/// </summary>public class ToDoDto:BaseDto{private string title;private string content;private int status;public string Title {get { return title; }set {  title = value; OnPropertyChanged(); }}public string Content {get { return content; }set { content = value; OnPropertyChanged(); }}public int Status {get { return status; }set { status = value; OnPropertyChanged(); }}}

三.把实体类(ToDo)和定义的数据传输类(ToDoDto) 进行关系映射

1.在 MyToDo.Api 项目中,创建一个 Extensions 扩展文件夹。再创建一个 AutoMapperProFile 类,并且继承自 MapperConfigurationExpression,该类用于配置所有实体类和数据传输类的映射关系。

    public class AutoMapperProFile:MapperConfigurationExpression{public AutoMapperProFile(){/// 实体类和数据传输类进行映射CreateMap<ToDo, ToDoDto>().ReverseMap();}}
  • ReverseMap 表示两者之间可以互相进行转换。

四.修改 ToDoController 控制器传参和IToDoService 服务传参

1. IToDoService接口类传入的ToDo实体改成ToDoDto

    public interface IToDoService:IBaseService<ToDoDto>{}

2.ToDoService 服务实现类,所有传入参数是ToDo实体,需全部换成ToDoDto。并且需要在构造函数中注入 IMapper 接口。

 /// <summary>/// 待办事项的实现/// </summary>public class ToDoService : IToDoService{private readonly IUnitOfWork work;private readonly IMapper mapper;public ToDoService(IUnitOfWork work,IMapper mapper){this.work = work;this.mapper = mapper;}public async Task<ApiResponse> AddAsync(ToDoDto model){try{var doto= mapper.Map<ToDo>(model);//进行数据映射转换await work.GetRepository<ToDo>().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<ToDo>();//获取仓储//删除之前,先进行查询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<ToDo>().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<ToDo>().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(ToDoDto model){try{var dbdoto = mapper.Map<ToDo>(model);var repository = work.GetRepository<ToDo>();//获取仓储//更新之前,先拿到要更新的数据var todo = await repository.GetFirstOrDefaultAsync(predicate: x => x.Id.Equals(dbdoto.Id));todo.Title = dbdoto.Title;todo.Content = dbdoto.Content;todo.Status = dbdoto.Status;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);}}}
  •  IMapper 接口里的 Map 方法,用于 Dto和实体类之间的数据映射转换

3.把ToDoController 控制器传入的ToDo实体改成ToDoDto

 [ApiController][Route("api/[controller]/[action]")]public class ToDoController:ControllerBase{private readonly IToDoService service;public ToDoController(IToDoService 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]ToDoDto model) => await service.AddAsync(model);[HttpPost]public async Task<ApiResponse> Update([FromBody] ToDoDto model) => await service.UpdateAsync(model);[HttpDelete]public async Task<ApiResponse> Delete(int id) => await service.DeleteAsync(id);}

五.最后,需要在Program.cs 中,进行注册 AutoMapper 服务

//注入AutoMapper
builder.Services.AddSingleton(new MapperConfiguration(config =>
{config.AddProfile(new AutoMapperProFile());
}).CreateMapper());


六.运行测试接口都正常,证明配置AutoMapper 成功了

相关文章:

Wpf 使用 Prism 实战开发Day13

配置 AutoMapper 关系映射 在上一节 ToDoController 控制器&#xff0c;或 IToDoService 服务接口中&#xff0c;方法的传参都是直接传的实体类。但在实际开发过程中&#xff0c;这样是不允许的。标准且规范的做法是&#xff0c;定义一个数据传输层&#xff0c;即Dto层。 一.在…...

62 C++ 多线程 -- mutex互斥量只能使用一次的问题分析-----以及解决方案递归mutex:recursive_mutex。

一 前提 以及问题 我们注意到&#xff0c;如果mutex.lock()两次&#xff0c;就会有问题 如下的代码有runtime exception mutex mymutex;mymutex.lock();mymutex.lock();//共享数据访问处理代码mymutex.unlock();mymutex.unlock(); 但是有这样的case存在 class Teacher183 …...

Chrome Devtools 调试指南

Chrome DevTools 是一套内置于 Google Chrome 浏览器的开发者工具&#xff0c;可以帮助开发者进行网页和应用的调试、优化和测试。以下是一些基本的调试指南&#xff1a; 打开 Chrome DevTools&#xff1a; 你可以通过以下方式之一打开 DevTools&#xff1a; 右键点击页面上的任…...

【Qt5】QString的成员函数chop

2024年1月19日&#xff0c;周五下午 QString 的 chop 方法用于从字符串的末尾移除指定数量的字符。这个方法会修改原始字符串&#xff0c;并返回 void。 下面是一个简单的示例&#xff1a; #include <QString> #include <QDebug>int main() {QString originalStr…...

Spring中的注解

Spring的配置 spring 2.5前xml spring 2.5后xmlannotation spring 3.0后annotationJavaConfig配置类 注解&#xff1a; 1.注入类 替换&#xff1a;<bean id"" class""></bean> 位置&#xff1a;类 语法:Component(value"注入容器中的…...

JavaScript 中的事件

1、鼠标事件&#xff1a; 鼠标单击事件&#xff08;click&#xff09;&#xff1a; 方法一 &#xff08;onclick&#xff09; <button id"btn" onclick"alert(88888)">点击弹框</button> 方法二&#xff08;利用addEventListener&#xff09;…...

hasattr、getattr、setattr

在Python中&#xff0c;hasattr()、getattr()和setattr()是一组内置函数&#xff0c;用于对对象的属性进行操作和查询。这些函数提供了一种方便的方式来检查对象是否具有特定属性&#xff0c;获取属性的值&#xff0c;以及设置属性的值。 1. hasattr hasattr()函数是一种重要…...

构建高可用消息队列系统 01

构建高可用消息队列系统 01 引言1. RabbitMQ简介介绍1.1 什么是RabbitMQ1.2 RabbitMQ的核心特性1.3 RabbitMQ与AMQP 2.安装RabbitMQ3.消息队列实践总结 引言 在当今互联网时代&#xff0c;消息队列系统扮演着至关重要的角色&#xff0c;它们被广泛应用于分布式系统、微服务架构…...

十本你不容错过的Docker入门到精通书籍推荐

前言&#xff1a; 最近有许多小伙伴私信让我推荐几本关于Docker学习的书籍&#xff0c;今天花了一下午的时间在网上查阅了一些资料和结合自己平时工作中的一些学习参考资料书籍写下了这篇文章。注意以下书籍都是十分优秀的Docker学习书籍&#xff08;因此排名不分先后&#xff…...

【AI接口】语音版、文心一言大模型和AI绘图、图片检测API

文章目录 一、语音版大模型AI1、接口2、请求参数3、请求参数示例4、接口返回示例 二、AI图片鉴黄合规检测API1、接口2、请求参数3、请求参数示例4、接口返回示例5、报错说明6、代码开源 三、人工智能AI绘画API1、接口2、请求参数3、请求参数示例4、接口返回示例5、AI绘画成果展…...

VUE 中的 v-for 和 v-if 是否可以共存

VUE 中的 v-for 和 v-if 是否可以共存 前言1、面试经2、正确回答3、总结总结&#xff1a; 前言 要成功&#xff0c;先发疯&#xff0c;头脑简单往前冲&#xff01; 三金四银&#xff0c;金九银十&#xff0c;多学知识&#xff0c;也不能埋头苦干&#xff0c;要成功&#xff0c…...

kubernetes 权限控制

RBAC引入了4个顶级资源对象&#xff1a;Role、ClusterRole&#xff1a;角色&#xff0c;用于指定一组权限&#xff1b;RoleBinding、ClusterRoleBinding&#xff1a;角色绑定&#xff0c;用于将角色&#xff08;权限&#xff09;赋予给对象 咱们通过Role可以配置命名空间下资源…...

vue中父组件异步传值,渲染问题

vue中父组件异步传值&#xff0c;渲染问题 父组件异步传值&#xff0c;子组件渲染不出来。有如下两种解决方法&#xff1a; 1、用v-if解决&#xff0c;当父组件有数据才渲染 <Child v-if"dataList && dataList.length > 0" :data-list"dataLis…...

09前后端分离+SSM整合的小案例

前端的Node 后端的Tomcat&#xff0c;是前端程序的容器。前端的npm 后端的maven 1. 导入前端项目 node版本&#xff1a;16.16.0 配置阿里镜像 npm config set registry https://registry.npmjs.org/ 更新npm版本 npm install -g npm9.6.6 用vscode打开解压后的项目 , 右上角…...

模仿ProTable创建ProTable组件

不多说废话直接上代码 父组件 // index.jsx/*** description 此ProTable是根据ProComponents里的ProTable模仿封装的简易版本* */ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useState } from react import { Card, Table } from antd import…...

新品发布 | 多通道总线记录仪TLog1004,是你期待的吗?

新品发布 2024年1月12日&#xff0c;同星智能又发布一款多通道 CAN &#xff08;FD&#xff09;总线、LIN 总线接口logger设备&#xff0c;此款产品在TLog1002基础上进行了升级&#xff0c;同时内置 3 路数字输入和 2 路数字输出&#xff0c;便于多种信号测量和系统集成。可以满…...

Double数据类型保留3位小数

Double scrapGrn scrapQty * Double.parseDouble(lot.getCnvrsnFctr()) / 1000 ; // 保留3位小数 DecimalFormat decimalFormat new DecimalFormat("#.###"); String scrapGrnStr decimalFormat.format(scrapGrn); 345.12344 处理后 为 345.123 34…...

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

目录 前言 一、膨胀&#xff08;Dilation&#xff09;与 腐蚀&#xff08;Erosion&#xff09; 二、形态学操作 1、开操作&#xff08;Opening&#xff09; 2、闭操作&#xff08;Closing&#xff09; 3、形态学梯度&#xff08;Morphological Gradient&#xff09; 4、…...

基于JavaWeb+SSM+Vue停车场微信小程序系统的设计和实现

基于JavaWebSSMVue停车场微信小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关…...

VUE---自定义指令

自定义指令&#xff1a;自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能。可分为全局注册与 局部注册。 全局注册&#xff08;main.js中注册&#xff09;&#xff1a; Vue.directive(指令名称,{ bind(ele,binding) {}, // 只执…...

突破百度网盘限速限制:baidu-wangpan-parse工具的技术实现与应用指南

突破百度网盘限速限制&#xff1a;baidu-wangpan-parse工具的技术实现与应用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在数字资源获取日益频繁的今天&#xff0c;许…...

Qwen3-ASR-0.6B应用分享:打造智能语音助手的第一步

Qwen3-ASR-0.6B应用分享&#xff1a;打造智能语音助手的第一步 1. 语音识别技术的新选择 在智能语音助手、会议记录、客服系统等场景中&#xff0c;语音识别(ASR)技术正变得越来越重要。传统方案要么识别准确率不够高&#xff0c;要么需要消耗大量计算资源。Qwen3-ASR-0.6B的…...

从“偏科生”GPT-3到“全能选手”:聊聊MMLU基准如何推动大模型进化

从“偏科生”到“全能选手”&#xff1a;MMLU基准如何重塑大模型进化路径 当GPT-3在2020年以1750亿参数震惊世界时&#xff0c;人们很快发现这个"天才"存在明显的知识盲区——它在某些专业领域的表现堪比专家&#xff0c;却在另一些基础学科上失误频频。这种"偏…...

Kubernetes 自动扩缩容最佳实践

Kubernetes 自动扩缩容最佳实践 一、前言 哥们&#xff0c;别整那些花里胡哨的。Kubernetes 自动扩缩容是保证应用高可用和成本优化的关键&#xff0c;今天直接上硬货&#xff0c;教你如何配置和优化自动扩缩容。 二、扩缩容类型对比 类型适用场景优势劣势HPA水平扩缩容响应…...

3分钟快速上手:ComfyUI-WanVideoWrapper视频生成AI终极指南

3分钟快速上手&#xff1a;ComfyUI-WanVideoWrapper视频生成AI终极指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 还在为复杂的视频生成工具配置而头疼吗&#xff1f;ComfyUI-WanVideoWrap…...

Vue与原生HTML页面无缝通信的iframe实现方案

1. 为什么需要Vue与原生HTML页面通信&#xff1f; 在实际开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个Vue项目需要集成第三方提供的HTML页面&#xff0c;比如支付网关、地图服务、视频播放器等。这些页面通常都是独立开发的&#xff0c;使用原生HTML/JavaScrip…...

VSCode安装与应用

vscode官网&#xff1a;https://code.visualstudio.com/Download 点击下一步 注意&#xff1a;这里将创建桌面快捷和下面的1、2勾选&#xff0c;3取消掉&#xff08;以便后续VSCode能右键快捷打开相关文件&#xff0c;3若不取消会将改变文件默认图标为VSCode&#xff0c;并且打…...

Chrome DevTools MCP:让 AI 编码助手拥有“浏览器之眼“

1.1 背景&#xff1a;AI 编程的"盲区" 在 AI 辅助编程的时代&#xff0c;我们已经习惯了让 AI 帮我们生成代码、修复 Bug、甚至重构项目。但长期以来&#xff0c;AI 编码助手有一个根本性的局限——它们只能"写"代码&#xff0c;却看不到代码在浏览器中实…...

3大突破 Koodo Reader 2.1.8:跨设备同步引擎重新定义数字阅读体验

3大突破 Koodo Reader 2.1.8&#xff1a;跨设备同步引擎重新定义数字阅读体验 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/ko…...

如何高效获取网页媒体资源:猫抓插件的全方位技术指南

如何高效获取网页媒体资源&#xff1a;猫抓插件的全方位技术指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代&#xff0c;我们每天都会遇到想要保存的视频、音频和图片资源。…...