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. 映射规则
        • 2. 使用映射
      • 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可以自动;

Dto转为Model需要映射,Model转为Dto也需要映射;
如果Dto和Model的字段不一样,就要配置映射规则

1.4.1 添加

  • 在Dtos文件夹下,添加DishesProfile.csRestaurantsProfile.cs,文件里存放的是映射规则
1. 映射规则

在这里插入图片描述

2. 使用映射

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; } = defa

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

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

相关文章

c++--------c++概念

定义与起源 C是一种高级编程语言&#xff0c;它是C语言的扩展。C由Bjarne Stroustrup在20世纪80年代初开发&#xff0c;最初被称为“C with Classes”。其设计目的是在保持C语言高效性的同时&#xff0c;增加面向对象编程&#xff08;OOP&#xff09;的特性。例如&#xff0c;…

面向对象设计过程的理解和实践

在软件开发的世界里&#xff0c;面向对象设计&#xff08;Object-Oriented Design&#xff0c;简称OOD&#xff09;是一项至关重要的技术。它不仅帮助我们更好地将现实世界的问题转化为软件系统中的对象&#xff0c;还确保这些对象之间能够高效地协同工作&#xff0c;共同实现系…

游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上

游泳溺水识别数据集&#xff1a; 对9984张原始图片进行YOLO&#xff0c;COCO JSON, VOC XML 格式的标注&#xff0c;平均识别率在91.7&#xff05;以上 &#xff0c;可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98&#xff05; 9818图片 有效集&#xff05;…

Llama3.370B超越GPT-4o和Claude3.5 Sonnet

AI领域日新月异&#xff0c;最近AI 领域发生了太多事情&#xff0c;本文就语言大模型Llama 3.3 70B、GPT-4o 和 Claude 3.5 Sonnet进行对比。 12月7日&#xff0c;Meta今年的最终AI模型将要来了。Meta12月6日发布了Llama 3.3&#xff0c;拥有700亿个参数&#xff0c;但其性能与…

linux内核网络分层概述

在开发应用时&#xff0c;我们使用 socket 实现网络数据的收发。以tcp为例&#xff0c;server端通过 socket, bind, listen来创建服务端&#xff0c;然后通过 accept接收客户端连接&#xff1b;客户端通过 socket和 connect系统调用来创建客户端。用于数据收发的系统调用包括 s…

【全栈实战】基于 Vue3 + Wot Design Uni 动手封装组件

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f60a;好久没有更新有关前端实战教程了&#xff0c;本文主要讲解【全栈实战】基于 Vue3 Wot Design Uni 动手封装组件&#xff01; &#x1f60a;这个教程你将会学到技术正确的选型、…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

60.基于SSM的个人网站的设计与实现(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;个人网站是在MySQL中建立数据表保存信息&#xff0c;运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SSM的网…

聊聊Flink:Flink的状态管理

一、Flink的状态是什么&#xff1f; 我们知道&#xff0c;Flink的一个算子可能会有多个子任务&#xff0c;每个子任务可能分布在不同的实例&#xff08;即slot&#xff09;上&#xff0c;我们可以把Flink的状态理解为某个算子的子任务在其当前实例上的一个变量&#xff0c;该变…

Idea 将多个module显示在同一个project

Idea 将多个maven项目显示在同一个project下 1、选择菜单 File-》New -》Module from Existing Sources -> 2、在弹出的界面选中对应的Module的pom.xml,然后点击OK按钮就行了 (弹出框上面也提示了Eclipse 项目选中.project文件&#xff1b;Maven 项目选中pom.xml; ) 最终显…

文件解析漏洞中间件(iis和Apache)

IIS解析漏洞 IIS6.X #环境 Windows Server 2003 在iis6.x中&#xff0c;.asp文件夹中的任意文件都会被当做asp文件去执行 在默认网站里创建一个a.asp文件夹并创建一个1.jpg写进我们的asp代码 <%now()%> #asp一句话 <%eval request("h")%> 单独创建一…

gitee别人仓库再上传自己仓库

一、新建一个自己的Git仓库 如果没有注册账号的朋友&#xff0c;可以先去注册一个Gitee的账号&#xff0c;用于管理自己的代码特别好用&#xff01;&#xff01;&#xff01; 接下来就是在gitee上新建一个自己的仓库&#xff0c;如下图所示 二、右建 Git Bush Here删除.git文件…

STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)

导言 Embedded IDE官网:https://em-ide.com/docs/intro 我猜肯定有部分人使用SI Keil开发STM32项目&#xff0c;也有vscode Keil开发STM32程序。SI或vscode编写代码&#xff0c;然后切换Keil编译、下载、调试程序。有一段时间&#xff0c;我也是这么干的。但是&#xff0c;程…

算法的学习笔记—扑克牌顺子(牛客JZ61)

&#x1f600;前言 扑克牌顺子问题是一道趣味性与逻辑性兼备的题目&#xff0c;要求判断五张牌是否能组成顺子&#xff0c;其中大小王&#xff08;癞子&#xff09;可作为任意牌面。癞子的特殊性增加了问题的复杂度&#xff0c;也为解题提供了更多的可能性。通过这一问题&#…

记录遇到的一个新的变种JS加密

源 逻辑分析 混淆代码的目的是隐藏实际逻辑&#xff0c;增加逆向工程的难度。以下是对代码的逐步分析和解读。 第一部分&#xff1a;立即调用的函数表达式 (IIFE) (function () {var _K [...]; // 存储大量字符串的数组 })();​ 1. 目的&#xff1a;这个 IIFE 是整个代码运行…

LeetCode:104.二叉树的最大深度

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节…

Fastjson <= 1.2.47 反序列化漏洞复现

0x01 前言 Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库&#xff0c;可以将 Java 对象转换为 JSON 格式&#xff0c;也可以将 JSON 字符串转换为 Java 对象&#xff0c;在中国和美国使用较为广泛。 0x02 漏洞成因 Fastjson < 1.2.68 版本在处理反序列化对象时…

python:函数

一、嵌套函数 1.1概念 嵌套函数是定义在另一个函数作用域内部的函数。外部函数可以访问其内部声明的嵌套函数&#xff0c;而嵌套函数则可以访问其外部函数的作用域&#xff08;包括参数和局部变量&#xff09;。 1.2实例 一般情况下&#xff0c;我们是这样书写嵌套函数的&a…

Linux 下的 GPT 和 MBR 分区表详解

文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR&#xff08;Master Boot Record&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT&#xff08;GUID Partition Table&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…

基于单片机的智能婴儿床监护系统多功能婴儿床摇篮系统

功能介绍 以STM32单片机为控制核心蓝牙传输控制可以进行哭闹检测、尿床检测、音乐播放、语音提醒、哭闹时可以进行摇床有不同的模式自动模式和睡眠模式 实物可做&#xff0c;其他功能也可以 电路图 PCB 源代码 u8 Temperature_High; //室内温度高阈值 u8 Temperature_…