Wpf 使用 Prism 实战开发Day12

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

待办事项接口增删(CURD)改查实现

Wpf 使用 Prism 实战开发Day12,c#,数据库

一.添加待办事项控制器(ToDoController)

  1. 控制器类需要继承 ControllerBase 基类
  2. 需要添加 [ApiController] 特性以及 [Route] 特性
  3. Route(路由) 特性参数规则,一般写法是 [Route("api/[controller]/[action]")] 。也就是路由访问路径:前缀api/当前控制器/具体的方法

Wpf 使用 Prism 实战开发Day12,c#,数据库


 二.封装服务共用类以及ToDoController 控制器逻辑实现

  • 为了业务处理逻辑和控制器之间实现解耦。可以通过设计:1.通用接口状态返回值类,2.共用(CURD)基础接口类,3.以及各自业务逻辑处理服务类。
  • 通用接口状态返回值类提供给共用基础接口类使用。共用基础接口类提供给不同的业务处理服务类使用。然后不同服务类提供给不同控制器进行访问使用。这样就能实现服务与控制器的之间解耦。

1.创建通用接口状态返回值(ApiResponse)类 

  • ApiResponse 类的构造函数用来构造返回,成功或失败的结果
 public class ApiResponse
 {
     /// <summary>
     /// 失败
     /// </summary>
     /// <param name="message"></param>
     /// <param name="status"></param>
     public ApiResponse(string message, bool status = false)
     { 
         this.Message = message;
         this.Status = status;
     }
     /// <summary>
     /// 成功
     /// </summary>
     /// <param name="status"></param>
     /// <param name="result"></param>
     public ApiResponse(bool status,object result) 
     {
       this.Status = status;
       this.Result = result;
     }
     /// <summary>
     /// 返回消息
     /// </summary>
     public string Message { get; set; }

     /// <summary>
     /// 返回状态
     /// </summary>
     public bool Status { get; set; }

     /// <summary>
     /// 结果
     /// </summary>
     public object Result { get; set; }
 }

2.创建一个共用的基础接口 增删改查(CURD) IBaseService 基类。

  • IBaseService 基类,设计传入一个泛型 T
  • 设计的是异步实现,定义的方法需按照规范,后缀添加Async
    public interface IBaseService<T>
    {
        /// <summary>
        /// 获取全部数据
        /// </summary>
        /// <returns></returns>
        Task<ApiResponse> GetAllAsync();
        /// <summary>
        /// 根据id,获取单条数据
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<ApiResponse> GetSingleAsync(int id);
        /// <summary>
        /// 添加数据,传入T泛型实体
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        Task<ApiResponse> AddAsync(T model);
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        Task<ApiResponse> UpdateAsync(T model);
        /// <summary>
        /// 删除,根据id进行删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<ApiResponse> DeleteAsync(int id);
    }

3.创建待办事项接口服务类(IToDoService),继承自共用的 IBaseService 接口类

  • 当前待办事项接口服务类(IToDoService),继承了IBaseService 基类后,需要传入泛型实体(待办事项实体) ToDo
  • 如果是忘备录接口服务类,就需要传入 Memo 实体了,也就是不同的实现,需传入不同的泛型实体,实现不同的逻辑。
    public interface IToDoService:IBaseService<ToDo>
    {

    }

4.接着,创建待办事项服务实现类(ToDoService),实现基类定义的方法逻辑。

/// <summary>
/// 待办事项的实现
/// </summary>
public class ToDoService : IToDoService
{
    private readonly IUnitOfWork work;

    public ToDoService(IUnitOfWork work)
    {
        this.work = work;
    }
    public async Task<ApiResponse> AddAsync(ToDo model)
    {
        try
        {
            await work.GetRepository<ToDo>().InsertAsync(model);
            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(ToDo model)
    {
        try
        {
            var repository = work.GetRepository<ToDo>();//获取仓储
            //更新之前,先拿到要更新的数据
            var todo = await repository.GetFirstOrDefaultAsync(predicate: x => x.Id.Equals(model.Id));
            todo.Title = model.Title;
            todo.Content = model.Content;
            todo.Status = model.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);
        }
    }
}

5.完成上述步骤后,还需要在Program.cs 中进行依赖注入。

AddTransient 是生命周期函数,还有AddScoped,AddSingleton 等三种生命周期。

builder.Services.AddTransient<IToDoService,ToDoService>();

Wpf 使用 Prism 实战开发Day12,c#,数据库


6.最后在 ToDoController 控制器构造函数中,注入 IToDoService 服务进行使用。

[FromBody] 是用于从Http请求的正文中 提取数据的属性。当在接口方法的参数前加上该标记时,web api 框架就会从http请求的正文中,提取请求的json数据并将其绑定到对应的参数上面。文章来源地址https://www.toymoban.com/news/detail-793159.html

    [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]ToDo model) => await service.AddAsync(model);

        [HttpPost]
        public async Task<ApiResponse> Update([FromBody] ToDo model) => await service.UpdateAsync(model);

        [HttpDelete]
        public async Task<ApiResponse> Delete(int id) => await service.DeleteAsync(id);
    }

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

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

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

相关文章

  • Wpf 使用 Prism 实战开发Day13

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

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

    备忘录控制器(MemoController)和待办事项控制器 (ToDoController)功能实现差不多一样。基本套路就是: 定义控制器(Controller) 定义数据传输层(Dto) 配置实体类(Entity)和数据传输类(Dto) 关系映射(Auto Mapper) 定义服务接口(IService) 实现服务接口 (Service) 把服务注入控

    2024年01月22日
    浏览(34)
  • Wpf 使用 Prism 实战开发Day11

     仓储(rep):仓储接口定义了对实体类访问数据库及操作的方法。它统一管理数据访问的逻辑,并与业务逻辑层进行解耦。 简单的理解就是对访问数据库的一层接口封装。 工作单元(uow):用来保证我们处理业务逻辑的,稳定性,完整性。防止在业务操作过程中,涉及对数据

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

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

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

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

    2024年02月08日
    浏览(34)
  • 【100天精通python】Day32:使用python操作数据库_MySQL下载、安装、配置、使用实战

    目录  专栏导读  1 MySQL概述 2 MySQL下载安装 2.1 下载  2.2 安装 2.3 配置

    2024年02月12日
    浏览(36)
  • WPF实战学习笔记08-创建数据库

    创建文件夹 ./Context 创建文件 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs ./Context/Todo.cs ./Context/User.cs 创建数据对象 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs 创建数据库DbSet ./Context/Todo.cs ./Context/User.cs 添加nuget包 Microsoft.EntityFrameworkCore.Design Shared design-time co

    2024年02月16日
    浏览(32)
  • 【100天精通python】Day44:python网络爬虫开发_爬虫基础(爬虫数据存储:基本文件存储,MySQL,NoSQL:MongDB,Redis 数据库存储+实战代码)

    目录 1 数据存储 1.1 爬虫存储:基本文件存储 1.2 爬虫存储:使用MySQL 数据库 1.3 爬虫 NoSQL 数据库使用 1.3.1 MongoDB 简介

    2024年02月11日
    浏览(52)
  • Django Web开发(day4)——数据模型使用与填充网站数据(对数据库的基本操作)

    本博客将会涉及:  Django 数据模型的使用 视频数据的导入 admin 后台的使用  1、Django 数据模型的使用  在上一篇中完成了网站的数据模型的创建,在数据模型创建之后, Django 会为我们的数据模型创建一套数据库抽象的 API 接口,以供我们进行检索数据、创建数据、更新和修

    2024年01月18日
    浏览(43)
  • Android Studio App开发中数据库SQLite的解析及实战使用(包括创建数据库,增删改查,记住密码等 附源码必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ SQLite是一种小巧的嵌入式数据库,使用方便,开发简单,如同mysql,oracle那样,SQLite也采用SQL语句管理数据,由于它属于轻型数据库,不涉及复杂的数据控制操作,因此App开发只用到数据定义和数据操纵两类SQL。 1:数据

    2024年02月03日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包