Wpf 使用 Prism 实战开发Day14

这篇具有很好参考价值的文章主要介绍了Wpf 使用 Prism 实战开发Day14。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Wpf 使用 Prism 实战开发Day14,WPF入门,c#,wpf


一.添加备忘录控制器(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>();

Wpf 使用 Prism 实战开发Day14,WPF入门,c#,wpf


二.高级查询实现

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

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)

Wpf 使用 Prism 实战开发Day14,WPF入门,c#,wpf


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 参数上

Wpf 使用 Prism 实战开发Day14,WPF入门,c#,wpf文章来源地址https://www.toymoban.com/news/detail-814425.html

到了这里,关于Wpf 使用 Prism 实战开发Day14的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Wpf 使用 Prism 实战开发Day19

    由于待办事项功能页,数据已正常渲染出来了。但页面新增,查询,修改,删除等功能还未实现。本章节来实现页面的请求后台实现CURD(增删改查) 根据渲染出来的待办事项,点击对应的待办事项时,查找出该条数据,显展示在编辑窗口中。 同时在搜索框中输入的参数或选

    2024年04月23日
    浏览(37)
  • Wpf 使用 Prism 实战开发Day13

    在上一节  ToDoController 控制器,或 IToDoService 服务接口中,方法的传参都是直接传的实体类。但在实际开发过程中,这样是不允许的。标准且规范的做法是,定义一个数据传输层,即Dto层。 1. 创建 BaseDto 基类,用于存放共用属性。 2. 创建待办事项 Dto类,并继承自 BaseDto 基类

    2024年01月20日
    浏览(45)
  • Wpf 使用 Prism 实战开发Day08

    1.效果图 MemoView.xaml 页面代码      1. 在  ItemsControl 中,添加滚动条  ScrollViewer  这样使用 ScrollViewer 把内容区域包裹起来,就能让内容区域支持滚动了        2 . 添加滚动条后的效果图如下:  使用md 中的一个自带动画 md:TransitioningContent 来实现该功能  需要设置一个属性,

    2024年02月03日
    浏览(38)
  • Wpf 使用 Prism 实战开发Day01

    1.  VisualStudio 2022 2.  . NET SDK 7.0 3.  Prism 版本 8.1.97 以上环境,如有新的版本,可自行选择安装新的版本为主 项目名称:这里只是记录学习,所以随便命名都无所谓,只要觉得合理就行 注意: 下载的包名是 Prism.DryIoc 。为什么不是Prism.xxx其他包,而是 Prism.DryIoc ,别问我,我也不

    2024年02月08日
    浏览(44)
  • Wpf 使用 Prism 实战开发Day03

    效果图:   创建 Models ,放置实体类。 实体类需要继承自 Prism 框架的  BindableBase ,目的是让实体类支持数据的动态变更!  例如: 系统导航菜单实体类 创建View文件夹  放置前端显示页面 。例如:创建首页: MainView.xaml 创建ViewModel 文件夹,放置前端逻辑处理类。意思是:有前端

    2024年02月08日
    浏览(44)
  • WPF超好用的框架Prism入门使用,上位机赶紧学起来!

    WPF框架Prism是一种用于开发模块化、可重用和可测试的WPF应用程序的框架。它提供了一种简单而强大的方式来管理复杂应用程序的代码和构建高度可扩展的应用程序。 如果您想使用Prism框架来开发WPF应用程序,需要学习以下几个方面: MVVM模式 :Prism基于MVVM模式,因此需要了

    2024年02月01日
    浏览(39)
  • WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(四)

    最近通过WPF开发项目,为了对WPF知识点进行总结,所以利用业余时间,开发一个学生信息管理系统【Student Information Management System】。前三篇文章进行了框架搭建和模块划分,后台WebApi接口编写,以及课程管理模块开发,本文在前三篇基础之上,继续深入开发学生信息管理系统

    2024年02月04日
    浏览(46)
  • WPF开发之Prism详解【内附源码】

    在实际应用开发中,随着项目业务逐渐复杂,耦合度会越来越高,维护成本也会直线上升,所以解耦也变得越来越重要。Prism框架为WPF开发中解耦提供了非常便捷的应用。今天主要以一个简单的小例子,简述WPF开发中Prism框架的简单应用,如有不足之处,还请指正。 Prism是一个

    2023年04月16日
    浏览(42)
  • WPF Prism的简单使用

    新建 WPF 项目,我是基于 .net 5.0-windows 创建的。 引入 Prism.DryIoc(8.1.97) 的 Nuget 包。 App.xaml 中引入命名空间。 将 App.xaml 中 Application 标签更改成 prism:PrismApplication 并去除 StartUri 属性,将 App.xaml.cs 中 Application 更改成 PrismApplication 。 实现 PrismApplication (实际上是 PrismApplicationBas

    2023年04月14日
    浏览(76)
  • WPF框架Prism的使用 二

    这是第二篇关于Prism-WPF的介绍,第一篇中我们简单介绍了Prism,然后讲述了如何搭建一个MVVM的简单页面程序。其实我写的文章就是把github上面的官方例子摘出来自己跑了一遍,然后加上了一些自己的理解,简单给大家分享一下。 下面放上传送门: 第一篇的链接 官方提供的示

    2024年04月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包