91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET?6開發TodoList應用之如何實現PUT請求

發布時間:2021-12-28 10:39:34 來源:億速云 閱讀:141 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關.NET 6開發TodoList應用之如何實現PUT請求,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

需求

PUT請求本身其實可說的并不多,過程也和創建基本類似。在這篇文章中,重點是填上之前文章里留的一個坑,我們曾經給TodoItem定義過一個標記完成的領域事件:TodoItemCompletedEvent,在SaveChangesAsync方法里做了一個DispatchEvents的操作。并且在DomainEventService實現IDomainEventService的Publish方法中暫時以下面的代碼代替了:

DomainEventService.cs

public async Task Publish(DomainEvent domainEvent)
{
    // 在這里暫時什么都不做,到CQRS那一篇的時候再回來補充這里的邏輯
    _logger.LogInformation("Publishing domain event. Event - {event}", domainEvent.GetType().Name);
}

在前幾篇應用MediatR實現CQRS的過程中,我們主要是和IRequest/IRequestHandler打的交道。那么本文將會涉及到另外一對常用的接口:INotification/INotificationHandler,來實現領域事件的處理。

目標

1.實現PUT請求;

2.實現領域事件的響應處理;

原理與思路

實現PUT請求的原理和思路與實現POST請求類似,就不展開了。關于實現領域事件響應的部分,我們需要實現INotification/INotificationHandler接口,并改寫Publish的實現,讓它能發布領域事件通知。

實現

PUT請求

我們拿更新TodoItem的完成狀態來舉例,首先來自定義一個領域異常NotFoundException,位于Application/Common/Exceptions里:

NotFoundException.cs

namespace TodoList.Application.Common.Exceptions;

public class NotFoundException : Exception
{
    public NotFoundException() : base() { }
    public NotFoundException(string message) : base(message) { }
    public NotFoundException(string message, Exception innerException) : base(message, innerException) { }
    public NotFoundException(string name, object key) : base($"Entity \"{name}\" ({key}) was not found.") { }
}

創建對應的Command:

UpdateTodoItemCommand.cs

using MediatR;
using TodoList.Application.Common.Exceptions;
using TodoList.Application.Common.Interfaces;
using TodoList.Domain.Entities;

namespace TodoList.Application.TodoItems.Commands.UpdateTodoItem;

public class UpdateTodoItemCommand : IRequest<TodoItem>
{
    public Guid Id { get; set; }
    public string? Title { get; set; }
    public bool Done { get; set; }
}

public class UpdateTodoItemCommandHandler : IRequestHandler<UpdateTodoItemCommand, TodoItem>
{
    private readonly IRepository<TodoItem> _repository;

    public UpdateTodoItemCommandHandler(IRepository<TodoItem> repository)
    {
        _repository = repository;
    }

    public async Task<TodoItem> Handle(UpdateTodoItemCommand request, CancellationToken cancellationToken)
    {
        var entity = await _repository.GetAsync(request.Id);
        if (entity == null)
        {
            throw new NotFoundException(nameof(TodoItem), request.Id);
        }

        entity.Title = request.Title ?? entity.Title;
        entity.Done = request.Done;

        await _repository.UpdateAsync(entity, cancellationToken);

        return entity;
    }
}

實現Controller:

TodoItemController.cs

[HttpPut("{id:Guid}")]
public async Task<ApiResponse<TodoItem>> Update(Guid id, [FromBody] UpdateTodoItemCommand command)
{
    if (id != command.Id)
    {
        return ApiResponse<TodoItem>.Fail("Query id not match witch body");
    }

    return ApiResponse<TodoItem>.Success(await _mediator.Send(command));
}

領域事件的發布和響應

首先需要在Application/Common/Models定義一個泛型類,實現INotification接口,用于發布領域事件:

DomainEventNotification.cs

using MediatR;
using TodoList.Domain.Base;

namespace TodoList.Application.Common.Models;

public class DomainEventNotification<TDomainEvent> : INotification where TDomainEvent : DomainEvent
{
    public DomainEventNotification(TDomainEvent domainEvent)
    {
        DomainEvent = domainEvent;
    }

    public TDomainEvent DomainEvent { get; }
}

接下來在Application/TodoItems/EventHandlers中創建對應的Handler:

TodoItemCompletedEventHandler.cs

using MediatR;
using Microsoft.Extensions.Logging;
using TodoList.Application.Common.Models;
using TodoList.Domain.Events;

namespace TodoList.Application.TodoItems.EventHandlers;

public class TodoItemCompletedEventHandler : INotificationHandler<DomainEventNotification<TodoItemCompletedEvent>>
{
    private readonly ILogger<TodoItemCompletedEventHandler> _logger;

    public TodoItemCompletedEventHandler(ILogger<TodoItemCompletedEventHandler> logger)
    {
        _logger = logger;
    }

    public Task Handle(DomainEventNotification<TodoItemCompletedEvent> notification, CancellationToken cancellationToken)
    {
        var domainEvent = notification.DomainEvent;

        // 這里我們還是只做日志輸出,實際使用中根據需要進行業務邏輯處理,但是在Handler中不建議繼續Send其他Command或Notification
        _logger.LogInformation("TodoList Domain Event: {DomainEvent}", domainEvent.GetType().Name);

        return Task.CompletedTask;
    }
}

最后去修改我們之前創建的DomainEventService,注入IMediator并發布領域事件,這樣就可以在Handler中進行響應了。

DomainEventService.cs

using MediatR;
using Microsoft.Extensions.Logging;
using TodoList.Application.Common.Interfaces;
using TodoList.Application.Common.Models;
using TodoList.Domain.Base;

namespace TodoList.Infrastructure.Services;

public class DomainEventService : IDomainEventService
{
    private readonly IMediator _mediator;
    private readonly ILogger<DomainEventService> _logger;

    public DomainEventService(IMediator mediator, ILogger<DomainEventService> logger)
    {
        _mediator = mediator;
        _logger = logger;
    }

    public async Task Publish(DomainEvent domainEvent)
    {
        _logger.LogInformation("Publishing domain event. Event - {event}", domainEvent.GetType().Name);
        await _mediator.Publish(GetNotificationCorrespondingToDomainEvent(domainEvent));
    }

    private INotification GetNotificationCorrespondingToDomainEvent(DomainEvent domainEvent)
    {
        return (INotification)Activator.CreateInstance(typeof(DomainEventNotification<>).MakeGenericType(domainEvent.GetType()), domainEvent)!;
    }
}

驗證

啟動Api項目,更新TodoItem的完成狀態。

請求

.NET?6開發TodoList應用之如何實現PUT請求

響應

.NET?6開發TodoList應用之如何實現PUT請求

領域事件發布

.NET?6開發TodoList應用之如何實現PUT請求

關于“.NET 6開發TodoList應用之如何實現PUT請求”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

方城县| 荆州市| 饶阳县| 云林县| 柏乡县| 新干县| 南昌县| 荣成市| 宿迁市| 博湖县| 尉犁县| 阳西县| 密云县| 焦作市| 白河县| 临海市| 中西区| 乌恰县| 涞水县| 嘉兴市| 新丰县| 耒阳市| 腾冲县| 莫力| 扎鲁特旗| 华宁县| 石嘴山市| 洞头县| 汾西县| 改则县| 科尔| 南溪县| 石柱| 衡南县| 乳山市| 漯河市| 崇文区| 黄冈市| 霍城县| 阿鲁科尔沁旗| 临猗县|