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.mfbz.cn/a/347981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

结构化文本编程语言:ST语言

ST语言通常指的是结构化文本&#xff08;Structured Text&#xff09;&#xff0c;是一种用于工业自动化和过程控制领域的编程语言。它被广泛应用于PLC&#xff08;可编程逻辑控制器&#xff09;和工业控制系统中&#xff0c;用于编写控制逻辑、数据采集和设备通信等任务。 ST语…

Qt5编译qextserialport(Qt5.14.2+VS2017)

1、qextserialport库下载 (1)github GitHub - qextserialport/qextserialport: Automatically exported from code.google.com/p/qextserialport (2) code.google https://code.google.com/archive/p/qextserialport/downloads 我下载的是最新版qextserialport-1.2rc.zip ​…

【踩坑日常】mysql查询错误排查

背景 在生产上发现一个接口数据怎么查都为空&#xff0c;做的日志记录&#xff0c;sql语句以及参数手动执行却能返回结果 排查 刚发现问题的时候&#xff0c;第一时间是通过日志去查看问题&#xff0c;模拟下核心点就如下 2024-01-24 14:10:03,912 DEBUG selectSQL:137 - >…

Vp9解码方式概述 -- Parsing Process

Vp9解码方式概述 – Parsing Process 本文是对vp9协议第9章&#xff0c;解析字符串函数的一个梳理&#xff0c;主要对几种解析类型&#xff08;Type&#xff09;的流程进行梳理 目录 Vp9解码方式概述 -- Parsing Process1. 如何解码视频&#xff1f;2. f(n)3. 布尔解码器Boole…

核心类库ArrayList、hashMap等

八. 核心类库 1. ArrayList 数组缺点 ArrayList&#xff0c;它常常被用来替代数组 数组的缺点&#xff1a;不能自动扩容&#xff0c;比如已经创建了大小为 5 的数组&#xff0c;再想放入一个元素&#xff0c;就放不下了&#xff0c;需要创建更大的数组&#xff0c;还得把旧…

基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151

Koenkk/zigbee2mqtt Stars: 10.5k License: GPL-3.0 Zigbee2MQTT 是一个 Zigbee &#x1f41d; 到 MQTT 桥接器 &#x1f309;&#xff0c;可以摆脱专有的 Zigbee 桥接器 &#x1f528; 允许您在不使用供应商桥接器或网关的情况下使用 Zigbee 设备通过 MQTT 桥接事件并控制 Z…

Salesforce Lightning 的 Close Case 按钮无法批量关闭 Case 的原因和解决方法

为 Lightning 页面添加了自定义的 Close Case 按钮&#xff08;方法可参考&#xff1a;https://www.simplysfdc.com/2021/01/salesforce-mass-close-case.html&#xff09;后&#xff0c;可能会出现无法批量关闭 Case 的情况。 选中多个 Case&#xff0c;再点击 Close Case 按…

MYSQL数据库详解(6)-- 视图存储方式触发器

MYSQL数据库详解&#xff08;6&#xff09; 视图特征&#xff1a;作用&#xff1a;创建视图使用视图删除视图 存储过程 ***为什么使用存储过程定义&#xff1a;存储过程和函数的区别缺陷&#xff1a;创建存储过程使用存储过程环境变量 局部环境变量 全局环境变量删除存储过程…

10个免费高质量视频素材网站,无版权,可商用。

推荐10个高清无水印视频素材网站&#xff0c;免费下载&#xff0c;无版权可商用&#xff0c;建议收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、音频、办公类…

【Web前端实操13】实现100*100的盒子的阴影效果,阴影值自拟

相关知识点&#xff1a; 盒阴影 box-shadow 向框添加一个或多个阴影。 1 box-shadow: h-shadow v-shadow blur spread color inset; 值描述h-shadow必选&#xff0c;水平阴影的位置v-shadow必选&#xff0c;垂直阴影的位置blur可选&#xff0c;模糊距离spread可选&#xf…

AI伦理边界:探索人工智能伦理计算

大家好&#xff0c;近年学界与工业界都已开始关注并热议 AI 伦理治理问题&#xff0c;也在伦理规范研究上取得了初步进展。然而&#xff0c;由于 AI 伦理的抽象性&#xff0c;如何定量化度量智能系统的伦理&#xff0c;还是一个未知的难题。 李学龙教授团队在《中国科学&#…

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …

江大白 | 万字长文图解Numpy教程,看这一篇就够了!

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满&#xff0c;有超级详细的图解。 原文链接&#xff1a;万字长文图解Numpy教程&#xff0c;看这一篇就够了&#xff01; (qq.com) 以下文章来源于博客&#xff1a;Medium 作者&…

.zip 文件和 .tar.gz文件 的区别

tgz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是一样的,只是压缩格式不一样. tar.gz格式的文件比zip文件要小不少。tar.gz压缩格式用于unix的操作系统, 而zip用于windows的操作系统,但在windows系统中WinRar工具同样可以解压缩tar.gz格式的。 扩展&#xff1a; z…

被困住了——如何从层级结构中获取子集

大家好&#xff0c;我是欧阳方超&#xff0c;我被一个问题困住了。 事情是这样的&#xff0c;与第三方平台对接时&#xff0c;第三方接口返回了一个具有层级结构的列表&#xff0c;比如下面这种结构&#xff1a; [{"id": 1,"name": "Root Category 1…

c++之说_9|自定义类型 struct

今天我这里下雪了 很冷 你哪里呢&#xff1f; 我们 来谈谈 自定义类型 这只是一个称呼 包含有 结构体&#xff08;struct&#xff09; 类&#xff08;class&#xff09; 共用体&#xff08;union&#xff09; 枚举&#xff08;enum&#xff09; 我们编程基本要常常与…

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求&#xff0c;仅想提高sink2es的qps&#xff0c;所以仅调节了sink2es的并行度&#xff0c;但在调节不同算子并行度时遇到一些问题&#xff0c;找出问题的根本原因解决问题&#xff0c;并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

对比损失函数

多看大佬的文章&#xff0c;总结的太好了&#xff01; 善于利用工具&#xff1a;researchrabbit 所以应该是contrastive metric learning

美,英,法,德、意大利和西班牙的geojson,以及区域json

美&#xff0c;英&#xff0c;法&#xff0c;德、意大利和西班牙的geojson文件 json地址 https://pan.baidu.com/s/1nio1bV_j-jAEVqgEHXWsNw?pwdqwer#list/path/GEOJSON 感谢大佬提供的 大佬连接 大佬的知乎原地址 国内geojson获取工具地址 http://da![在这里插入图片描述](h…

【大数据】流处理基础概念(二):时间语义(处理时间、事件时间、水位线)

流处理基础概念&#xff08;一&#xff09;&#xff1a;Dataflow 编程基础、并行流处理流处理基础概念&#xff08;二&#xff09;&#xff1a;时间语义&#xff08;处理时间、事件时间、水位线&#xff09;流处理基础概念&#xff08;三&#xff09;&#xff1a;状态和一致性模…
最新文章