溫馨提示×

溫馨提示×

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

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

asp.net core中MediatR如何使用

發布時間:2021-07-15 14:23:33 來源:億速云 閱讀:395 作者:Leah 欄目:大數據

ASP.NET Core 中 MediatR 如何使用

在現代的 ASP.NET Core 應用程序中,隨著業務邏輯的復雜性增加,代碼的組織和維護變得越來越重要。為了保持代碼的整潔和可維護性,開發者通常會采用一些設計模式和工具來解耦業務邏輯。MediatR 是一個流行的庫,它實現了中介者模式(Mediator Pattern),幫助我們在 ASP.NET Core 中更好地組織和管理請求和響應的處理邏輯。

本文將詳細介紹如何在 ASP.NET Core 中使用 MediatR,包括安裝、配置、創建請求和處理器、以及如何處理通知和管道行為。

1. 什么是 MediatR?

MediatR 是一個輕量級的庫,它實現了中介者模式,允許你將請求和響應的處理邏輯解耦。通過使用 MediatR,你可以將業務邏輯從控制器中分離出來,使代碼更加模塊化和易于測試。

MediatR 的核心概念包括:

  • 請求/響應模型:通過 IRequest<TResponse> 接口定義請求,并通過 IRequestHandler<TRequest, TResponse> 接口處理請求。
  • 通知:通過 INotification 接口定義通知,并通過 INotificationHandler<TNotification> 接口處理通知。
  • 管道行為:通過 IPipelineBehavior<TRequest, TResponse> 接口定義管道行為,可以在請求處理前后執行一些邏輯。

2. 安裝 MediatR

首先,你需要在 ASP.NET Core 項目中安裝 MediatR 和 MediatR.Extensions.Microsoft.DependencyInjection 包。你可以通過 NuGet 包管理器或命令行工具來安裝:

dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection

3. 配置 MediatR

安裝完成后,你需要在 Startup.csProgram.cs 中配置 MediatR。如果你使用的是 .NET 6 或更高版本,通常在 Program.cs 中進行配置:

var builder = WebApplication.CreateBuilder(args);

// 添加 MediatR 服務
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

var app = builder.Build();

// 其他中間件配置

app.Run();

在這個配置中,AddMediatR 方法會自動掃描指定程序集中的所有請求處理器和通知處理器,并將它們注冊到依賴注入容器中。

4. 創建請求和處理器

4.1 定義請求

首先,你需要定義一個請求。請求是一個簡單的類,通常實現 IRequest<TResponse> 接口。例如,假設我們有一個獲取用戶信息的請求:

public class GetUserByIdQuery : IRequest<User>
{
    public int UserId { get; set; }
}

在這個例子中,GetUserByIdQuery 是一個請求,它返回一個 User 對象。

4.2 創建處理器

接下來,你需要創建一個處理器來處理這個請求。處理器是一個類,實現 IRequestHandler<TRequest, TResponse> 接口。例如:

public class GetUserByIdQueryHandler : IRequestHandler<GetUserByIdQuery, User>
{
    private readonly IUserRepository _userRepository;

    public GetUserByIdQueryHandler(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public async Task<User> Handle(GetUserByIdQuery request, CancellationToken cancellationToken)
    {
        return await _userRepository.GetUserByIdAsync(request.UserId);
    }
}

在這個處理器中,我們通過依賴注入獲取了 IUserRepository,并在 Handle 方法中處理了請求。

4.3 在控制器中使用 MediatR

現在,你可以在控制器中使用 MediatR 來發送請求并獲取響應。例如:

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private readonly IMediator _mediator;

    public UsersController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<User>> GetUserById(int id)
    {
        var query = new GetUserByIdQuery { UserId = id };
        var user = await _mediator.Send(query);

        if (user == null)
        {
            return NotFound();
        }

        return Ok(user);
    }
}

在這個控制器中,我們通過 IMediator 發送了 GetUserByIdQuery 請求,并返回了處理結果。

5. 處理通知

除了請求/響應模型,MediatR 還支持通知。通知是一種廣播機制,允許多個處理器處理同一個通知。

5.1 定義通知

首先,你需要定義一個通知。通知是一個簡單的類,通常實現 INotification 接口。例如:

public class UserCreatedNotification : INotification
{
    public int UserId { get; set; }
}

5.2 創建通知處理器

接下來,你需要創建一個或多個通知處理器。通知處理器是一個類,實現 INotificationHandler<TNotification> 接口。例如:

public class UserCreatedNotificationHandler : INotificationHandler<UserCreatedNotification>
{
    public async Task Handle(UserCreatedNotification notification, CancellationToken cancellationToken)
    {
        // 處理通知邏輯
        Console.WriteLine($"User created with ID: {notification.UserId}");
    }
}

5.3 發送通知

你可以在任何地方使用 IMediator 來發送通知。例如:

public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, int>
{
    private readonly IMediator _mediator;

    public CreateUserCommandHandler(IMediator mediator)
    {
        _mediator = mediator;
    }

    public async Task<int> Handle(CreateUserCommand request, CancellationToken cancellationToken)
    {
        // 創建用戶的邏輯
        var userId = 1; // 假設創建用戶后返回的 ID 是 1

        // 發送通知
        await _mediator.Publish(new UserCreatedNotification { UserId = userId });

        return userId;
    }
}

在這個例子中,當用戶創建成功后,我們發送了一個 UserCreatedNotification 通知。

6. 使用管道行為

MediatR 還支持管道行為,允許你在請求處理前后執行一些邏輯。管道行為通常用于日志記錄、驗證、性能監控等場景。

6.1 定義管道行為

首先,你需要定義一個管道行為。管道行為是一個類,實現 IPipelineBehavior<TRequest, TResponse> 接口。例如:

public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
    private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;

    public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
    {
        _logger = logger;
    }

    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        _logger.LogInformation($"Handling {typeof(TRequest).Name}");

        var response = await next();

        _logger.LogInformation($"Handled {typeof(TResponse).Name}");

        return response;
    }
}

在這個管道行為中,我們在請求處理前后記錄了日志。

6.2 注冊管道行為

你需要在 Startup.csProgram.cs 中注冊管道行為。例如:

builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));

6.3 使用管道行為

注冊完成后,管道行為會自動應用到所有的請求處理中。你不需要在代碼中顯式調用管道行為。

7. 總結

MediatR 是一個強大的工具,它幫助我們在 ASP.NET Core 中更好地組織和管理請求和響應的處理邏輯。通過使用 MediatR,我們可以將業務邏輯從控制器中分離出來,使代碼更加模塊化和易于測試。本文介紹了如何在 ASP.NET Core 中安裝、配置和使用 MediatR,包括創建請求和處理器、處理通知以及使用管道行為。希望這些內容能幫助你在實際項目中更好地使用 MediatR。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女