Restaurants WebAPI(二)——DTO/CQRS


文章目录

  • 项目地址
  • 一、DTO
    • 1.1 创建Restaurant的Dto
    • 1.2 修改之前未使用Dto的接口
      • 1.2.1 修改GetRestaurantByIdUseCase
      • 1.2.2 修改IGetRestaurantByIdUseCase接口
      • 1.2.3 再次请求接口
    • 1.3 显示Dish List
      • 1.3.1创建DishDto
      • 1.3.2 在RestaurantDto里添加DishDto
      • 1.3.3 使用Include添加Dishes
    • 1.4 使用AutoMapper 简化Dto的过程
      • 1.4.1 添加
      • 1.4.2 删除
      • 1.4.3 修改
      • 1.4.4
  • 二、CRUD完善
    • 2.1 Create Restaurants
      • 2.1.1 创建Create的Dto
      • 2.1.2 修改AutoMapper的RestaurantsProfile
      • 2.1.3 添加Create的UseCase
      • 2.1.4 提取UseCase为接口
      • 2.1.5 添加Create方法到接接口
      • 2.1.6 实现接口IRestaurantsRepository
      • 2.1.7 创建Create的Controller
      • 2.1.8测试接口
  • 三、CQRS 模式
    • 3.1安装MediaR包
    • 3.2 Create Restaurant 添加餐厅
      • 1. 创建Command命令
      • 2. 创建Handler
    • 3.3 读取所有餐厅和一个餐厅
      • 3.3.1 获取所有餐厅
        • 1. GetAllRestaurantsQuery
        • 2. GetAllRestaurantsQueryHandler
      • 3.3.2 根据Id获取一个餐厅
        • 1. GetRestaurantByIdQuery
        • 2. GetRestaurantByIdQueryHandler
    • 3.4 在ServiceCollectionExtensions注册服务
    • 3.5 controller里修改方式


项目地址

  • 教程作者:Jakub Kozera
  • 教程地址UD:
https://www.csdn.com/course/aspnet-core-web-api-clean-architecture-azure/learn/lecture/42032838#overview
  • 代码仓库地址:
  • 所用到的框架和插件:
.net 8

一、DTO

避免直接暴露数据库实体

1.1 创建Restaurant的Dto

  1. 在Restaurants.Application创建Dtos文件夹
  2. 创建RestaurantDto.cs,FromRestaurant静态方法,只是为了包装真正的实体类只返回需要的属性;
using Restaurants.Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Restaurants.Application.Dtos
{public class RestaurantDto{public int Id { get; set; }public string Name { get; set; } = default!;public string Description { get; set; } = default!;public string Category { get; set; } = default!;public bool HasDelivery { get; set; }public string? City { get; set; }public string? Street { get; set; }public string? ZipCode { get; set; }public List<DishDto> Dishes { get; set; } = new List<DishDto>();public static RestaurantDto FromRestaurant(Restaurant restaurant){return new RestaurantDto(){Id = restaurant.Id,Name = restaurant.Name,Description = restaurant.Description,Category = restaurant.Category,HasDelivery = restaurant.HasDelivery,City = restaurant.Address?.City,Street = restaurant.Address?.Street,ZipCode = restaurant.Address?.ZipCode,};}}
}

1.2 修改之前未使用Dto的接口

  • 只需要在Application层进行修改

1.2.1 修改GetRestaurantByIdUseCase

  • 调用RestaurantDto的静态方法FromRestaurant,并传入实体类restaurant,进行包装,只返回包装后的类;

在这里插入图片描述

1.2.2 修改IGetRestaurantByIdUseCase接口

  • 只需要修改IGetRestaurantByIdUseCase的接口;
using Restaurants.Application.Dtos;namespace Restaurants.Application.RestaurantsUseCase
{public interface IGetAllRestaurantsUseCase{Task<IEnumerable<RestaurantDto>> Execute();}
}

1.2.3 再次请求接口

  • 我们需要隐藏的Email和Phone的信息,已经没有显示了 在这里插入图片描述
  • 但是有个问题是,dishes的列表是空的

1.3 显示Dish List

1.3.1创建DishDto

  1. Dtos文件夹下,创建DishDto.cs,其中,静态方法的FromEntity(Dish dish)用于转换Dish为DishDto
using Restaurants.Domain.Models;namespace Restaurants.Application.Dtos
{public class DishDto{public int Id { get; set; }public string Name { get; set; } = default!;public string Description { get; set; } = default!;public decimal Price { get; set; }public int? Kilocalories { get; set; }public static DishDto FromEntity(Dish dish){return new DishDto(){Id = dish.Id,Name = dish.Name,Description = dish.Description,Price = dish.Price,Kilocalories = dish.Kilocalories};}}
}

1.3.2 在RestaurantDto里添加DishDto

  • 将restaurant.Dishes 转为DishDto是关键,使用Select

在这里插入图片描述

1.3.3 使用Include添加Dishes

  • 在EF执行的地方,添加把Dishes添加进入;Restaurants.Infrastructure层的Repositories
  • RestaurantsRepository.cs

在这里插入图片描述

1.4 使用AutoMapper 简化Dto的过程

  • 上面我们都是通过自己创建静态方法来手动创建和注入Dto,使用AutoMapper可以自动

1.4.1 添加

  • 在Dtos文件夹下,添加DishesProfile.csRestaurantsProfile.cs

1.4.2 删除

  • 删除之前自己添加的静态方法

1.4.3 修改

  • 修改之前UseCase里的获取Dto的方法,改为automapper

1.4.4

  • 在Application的Extensions里注册服务

二、CRUD完善

2.1 Create Restaurants

2.1.1 创建Create的Dto

  • 由于Create需要餐厅的详细地址和电话,所以之前读取餐厅的DTO无法使用
using Restaurants.Domain.Models;namespace Restaurants.Application.Dtos
{public class CreateRestaurantDto{public int Id { get; set; }public string Name { get; set; } = default!;public string Description 

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

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

相关文章

202412月最新植物大战僵尸杂交版【V3.0.1】更新内容与下载

以下是对UI优化和新内容添加的摘要&#xff1a; UI优化摘要&#xff1a; 主界面重做&#xff1a;对游戏的主界面进行全面的设计更新&#xff0c;提升用户体验。商店重做&#xff1a;对游戏内的商店界面进行重新设计&#xff0c;以改善玩家的购物体验。选卡界面增加图鉴功能&a…

MCU驱动使用

一、时钟的配置&#xff1a; AG32 通常使用 HSE 外部晶体&#xff08;范围&#xff1a;4M~16M&#xff09;。 AG32 中不需要手动设置 PLL 时钟&#xff08;时钟树由系统自动配置&#xff0c;无须用户关注&#xff09;。用户只需在配置文件中给出外部晶振频率和系统主频即可。 …

服务器防火墙设置某个端口号只允许固定 ip地址访问

服务器防火墙设置某个端口号只允许固定 ip地址访问是运维常见的功能&#xff0c;今天我们分享一下&#xff1a; 一、Linux环境 1、firewall 方式 1&#xff09;允许特定 IP 地址访问 23 端口 sudo firewall-cmd --zonepublic --add-rich-rulerule family"ipv4" s…

Hexo Next主题集成百度统计

个人博客地址&#xff1a;Hexo Next主题集成百度统计 | 一张假钞的真实世界。 首先&#xff0c;需要在百度统计控制台新增自己的站点。 点击“新增网站”按钮&#xff1a; 按照要求输入相关信息并保存&#xff0c;页面跳转至代码获取页面。从代码页面中拷贝网站的ID&#xff1…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello&#xff0c;大家好&#xff0c;我是后期圈&#xff01; 在视频创作中&#xff0c;电影级的视频素材能够为作品增添专业质感&#xff0c;让画面更具冲击力。无论是广告、电影短片&#xff0c;还是品牌宣传&#xff0c;高质量的视频素材都是不可或缺的资源。然而&#xff…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

华为云计算HCIE笔记01

第一章 华为云Stack解决方案 2018年云栖大会马云提出的数据科学时代&#xff08;Data technology&#xff09;&#xff0c;相较于传统信息时代&#xff0c;技术的变更主要集中在过去我们更加看重的是传输&#xff0c;也就是传统的网络建设&#xff0c;随着目前国家网络建设的完…

Redis的主从集群以及哨兵机制学习总结

Redis的主从集群以及哨兵机制 为什么要使用主从集群&#xff1f;部署主从集群主从集群怎么同步数据&#xff1f;数据同步的方式和时机实例查看主从数据同步原理增量同步潜在的问题主从集群的优化 主节点宕机怎么办&#xff1f;哨兵机制 为什么要使用主从集群&#xff1f; 我们…

【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种基于试错的方法&#xff0c;旨在通过智能体与环境的交互&#xff0c;学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体&#xff08;Agent&#xff09; 执行动作并与环境…

行政管理痛点解决方案:OA系统助力企业提效减负

作为企业行政管理的中枢&#xff0c;行政部门承担着企业运转的核心职责。从办公物资采购到会议室安排&#xff0c;从流程审批到企业文化建设&#xff0c;行政工作繁杂且细致。然而&#xff0c;在传统管理模式下&#xff0c;行政工作往往面临以下痛点&#xff1a; 流程繁琐&…

Flask内存马学习

文章目录 参考文章环境搭建before_request方法构造内存马after_request方法构造内存马errorhandler方式构造内存马add_url_rule方式构造内存马 参考文章 https://www.mewo.cc/archives/10/ https://www.cnblogs.com/gxngxngxn/p/18181936 前人栽树, 后人乘凉 大佬们太nb了, …

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书 一、下载影刀&#xff1a; https://www.winrobot360.com/share/activity?inviteUserUuid595634970300317698 二、加入应用市场 https://www.yingdao.com/share/accede/?inviteKeyb2d3f22a-fd6c-4a…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发&#xff0c;rtthread studios 与 vscode&#xff0c;鱼与熊掌可以兼得否&#xff0c;其实是可以的&#xff0c;下面通过三个步骤&#xff0c;实现基于FT2232HL高速调试器的&#xff0c;stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【机器人】ATM 用于策略学习的任意点轨迹建模 RSS 2024 | 论文精读

文章提出了一种新的框架&#xff0c;名为Any-point Trajectory Modeling (ATM) &#xff0c;称为任意点轨迹建模。 用于从视频中预测任意点的未来轨迹&#xff0c;从而在最少动作标签数据的情况下&#xff0c;学习稳健的视觉运动策略。 图中展示了三个案例&#xff0c;打开柜子…

linux----系统i/o

基本概念 在Linux系统中&#xff0c;I/O&#xff08;Input/Output&#xff09;即输入/输出&#xff0c;是操作系统与外部设备&#xff08;如磁盘、终端、网络等&#xff09;进行数据交互的机制。它涉及到从外部设备读取数据到内存&#xff08;输入操作&#xff09;&#xff0c…

Mac 开机 一闪框 mediasharingd

Mac 开机 一闪框一闪而过 mediasharingd ->系统偏好设置->共享->服务的复选框全部取消&#xff0c;保存。 重启解决。

纯前端实现更新检测

通过判断打包后的html文件中的js入口是否发生变化&#xff0c;进而实现前端的代码更新 为了使打包后的文件带有hash值&#xff0c;需要对vite打包进行配置 import { defineConfig } from vite; import vue from vitejs/plugin-vue; import { resolve } from path; import AutoI…

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具&#xff0c;并取消勾选“识别和存储面邻域信息”&#xff0c;如下&#xff1a; 2、得到的线要素&#xff0c;如下&#xff1a;

基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】

代码包运行启动成功&#xff01;不管你有没有运行环境&#xff0c;哪怕你是刚买的新电脑&#xff0c;也包启动运行成功&#xff01;有不懂的地方随便问&#xff01;问到会为止&#xff01; 【功能介绍】 基于SpringBootVue实现的林业产品推荐系统采用前后端分离的架构方式&…

【Java基础面试题024】Java中包装类型和基本类型的区别是什么?

回答重点 基本类型&#xff1a; Java中有8种基本数据类型&#xff08;byte、short、int、long、float、double、char、boolean&#xff09;他们是直接存储数值的变量&#xff0c;位于栈上&#xff08;局部变量在栈上、成员变量在堆上&#xff0c;静态字段/类在方法区&#xf…