MediatR 試用紀錄
一個很受歡迎的套件。常用於實作CQRS pattern。試用看看。
引言
MediatR應用類型現在有三種
開發前置準備
開發環境
安裝套件
註冊
關鍵指令紀錄
IRequest 模式
IRequest 模式INotification模式
INotification模式試用心得
Last updated
一個很受歡迎的套件。常用於實作CQRS pattern。試用看看。
IRequest 模式INotification模式Last updated
PM> Install-Package MediatR
PM> Install-Package MediatR.Extensions.Microsoft.DependencyInjection// Add services to the container.
services.AddMediatR(typeof(Program));using MediatR;
namespace YourProject.MediatRHandler;
/// 此例是CQRS pattern 中的 Query 簡要範例,Command 也是差不多的用法。
/// IRequest Handler
public class QueryUserHandler : IRequestHandler<QueryUserRequest, QueryUserResponse>
{
public Task<QueryUserResponse> Handle(QueryUserRequest request, CancellationToken cancellationToken)
{
return Task.FromResult(new QueryUserResponse {
DisplayName = $"我是{request.Id}的名字"
});
}
}
/// Response
public class QueryUserResponse
{
public string DisplayName { get; set; } = string.Empty;
}
/// Request
public class QueryUserRequest : IRequest<QueryUserResponse>
{
public int Id { get; set; }
}[Route("api/[controller]")]
[ApiController]
public class MyDataController : ControllerBase
{
readonly MediatR.IMediator _mediator;
public MyDataController(MediatR.IMediator mediator)
{
_mediator = mediator;
}
[HttpPost("[action]")]
public QueryUserResponse QryUserData()
{
var response = _mediator.Send(new QueryUserRequest { Id = 987 }).Result;
return response;
}
}using MediatR;
namespace YourProject.MediatRHandler;
/// 定義 INotification
public class Ping : INotification {
public string Msg { get; set; } = string.Empty;
}using MediatR;
namespace YourProject.MediatRHandler;
/// INotification Handler - 接收Notification
/// ※接收方原則上在那都可以,此為到方便測試所以寫在附近。
public class Pong1 : INotificationHandler<Ping>
{
public Task Handle(Ping notification, CancellationToken cancellationToken)
{
Debug.WriteLine($"Pong1:{notification.Msg}:@{DateTime.Now}");
return Task.CompletedTask;
}
}
/// INotification Handler - 另一個接收Notification
/// ※接收方原則上在那都可以,此為到方便測試所以寫在附近。
public class Pong2 : INotificationHandler<Ping>
{
public Task Handle(Ping notification, CancellationToken cancellationToken)
{
Debug.WriteLine($"Pong2:{notification.Msg}:@{DateTime.Now}");
return Task.CompletedTask;
}
}[Route("api/[controller]")]
[ApiController]
public class MyDataController : ControllerBase
{
readonly MediatR.IMediator _mediator;
public MyDataController(MediatR.IMediator mediator)
{
_mediator = mediator;
}
[HttpPost("[action]")]
public QueryUserResponse QryUserData()
{
// 比如:執行商業邏輯
var response = _mediator.Send(new QueryUserRequest { Id = 987 }).Result;
// 比如:當完成商業邏輯後送出通知訊息。
// 送出 Notification
_mediator.Publish(new MediatRHandler.Ping { Msg = "XY23" });
return response;
}
}