在現代的 ASP.NET Core 應用程序中,隨著業務邏輯的復雜性增加,代碼的組織和維護變得越來越重要。為了保持代碼的整潔和可維護性,開發者通常會采用一些設計模式和工具來解耦業務邏輯。MediatR 是一個流行的庫,它實現了中介者模式(Mediator Pattern),幫助我們在 ASP.NET Core 中更好地組織和管理請求和響應的處理邏輯。
本文將詳細介紹如何在 ASP.NET Core 中使用 MediatR,包括安裝、配置、創建請求和處理器、以及如何處理通知和管道行為。
MediatR 是一個輕量級的庫,它實現了中介者模式,允許你將請求和響應的處理邏輯解耦。通過使用 MediatR,你可以將業務邏輯從控制器中分離出來,使代碼更加模塊化和易于測試。
MediatR 的核心概念包括:
IRequest<TResponse>
接口定義請求,并通過 IRequestHandler<TRequest, TResponse>
接口處理請求。INotification
接口定義通知,并通過 INotificationHandler<TNotification>
接口處理通知。IPipelineBehavior<TRequest, TResponse>
接口定義管道行為,可以在請求處理前后執行一些邏輯。首先,你需要在 ASP.NET Core 項目中安裝 MediatR 和 MediatR.Extensions.Microsoft.DependencyInjection 包。你可以通過 NuGet 包管理器或命令行工具來安裝:
dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
安裝完成后,你需要在 Startup.cs
或 Program.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
方法會自動掃描指定程序集中的所有請求處理器和通知處理器,并將它們注冊到依賴注入容器中。
首先,你需要定義一個請求。請求是一個簡單的類,通常實現 IRequest<TResponse>
接口。例如,假設我們有一個獲取用戶信息的請求:
public class GetUserByIdQuery : IRequest<User>
{
public int UserId { get; set; }
}
在這個例子中,GetUserByIdQuery
是一個請求,它返回一個 User
對象。
接下來,你需要創建一個處理器來處理這個請求。處理器是一個類,實現 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
方法中處理了請求。
現在,你可以在控制器中使用 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
請求,并返回了處理結果。
除了請求/響應模型,MediatR 還支持通知。通知是一種廣播機制,允許多個處理器處理同一個通知。
首先,你需要定義一個通知。通知是一個簡單的類,通常實現 INotification
接口。例如:
public class UserCreatedNotification : INotification
{
public int UserId { get; set; }
}
接下來,你需要創建一個或多個通知處理器。通知處理器是一個類,實現 INotificationHandler<TNotification>
接口。例如:
public class UserCreatedNotificationHandler : INotificationHandler<UserCreatedNotification>
{
public async Task Handle(UserCreatedNotification notification, CancellationToken cancellationToken)
{
// 處理通知邏輯
Console.WriteLine($"User created with ID: {notification.UserId}");
}
}
你可以在任何地方使用 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
通知。
MediatR 還支持管道行為,允許你在請求處理前后執行一些邏輯。管道行為通常用于日志記錄、驗證、性能監控等場景。
首先,你需要定義一個管道行為。管道行為是一個類,實現 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;
}
}
在這個管道行為中,我們在請求處理前后記錄了日志。
你需要在 Startup.cs
或 Program.cs
中注冊管道行為。例如:
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
注冊完成后,管道行為會自動應用到所有的請求處理中。你不需要在代碼中顯式調用管道行為。
MediatR 是一個強大的工具,它幫助我們在 ASP.NET Core 中更好地組織和管理請求和響應的處理邏輯。通過使用 MediatR,我們可以將業務邏輯從控制器中分離出來,使代碼更加模塊化和易于測試。本文介紹了如何在 ASP.NET Core 中安裝、配置和使用 MediatR,包括創建請求和處理器、處理通知以及使用管道行為。希望這些內容能幫助你在實際項目中更好地使用 MediatR。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。