关于c#:ASPNET-Core-MVC-入门到精通-3-使用MediatR

17次阅读

共计 2621 个字符,预计需要花费 7 分钟才能阅读完成。

ASP.NET Core MVC 入门到精通 – 3. 应用 MediatR

环境:

  • .NET 5
  • ASP.NET Core MVC (project)

1. MediatR

MediatR .NET 中的简略中介者模式实现,一种 过程内消息传递机制(无其余内部依赖)。反对以同步或异步的模式进行申请 / 响应,命令,查问,告诉和事件的消息传递,并通过 C# 泛型反对音讯的智能调度。

Simple mediator implementation in .NET
In-process messaging with no dependencies.
Supports request/response, commands, queries, notifications and events, synchronous and async with intelligent dispatching via C# generic variance.

另:中介者模式 – 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合涣散,且能够独立地扭转它们之间的交互。中介者模式又叫调解模式,它是迪米特法令的典型利用。

2. 装置 & 配置

对于.NET5 (.net core), 应用 nuget 装置MediatR.Extensions.Microsoft.DependencyInjection.

配置:

public void ConfigureServices(IServiceCollection services)
{services.AddControllersWithViews();
    services.AddMediatR(typeof(Startup));
}

3. MediatR 音讯类型

3.1. Notifications 告诉模式

Notifications 告诉模式用于生产者发送告诉,消费者(能够多个)接管到告诉后,进行后续解决。
例:一个 APS.NET 页面,拜访时,发送 Notifications 告诉;消费者简略记录收到告诉的工夫。

3.1.1. 定义基于 INotification 的告诉类

public class Ping : INotification {}

3.1.2. 定义消费者(关注告诉的解决办法)

public class Pong1 : INotificationHandler<Ping>
{public Task Handle(Ping notification, CancellationToken cancellationToken)
    {Debug.WriteLine($"Pong1, {DateTime.Now}");
        return Task.CompletedTask;
    }
}

public class Pong2 : INotificationHandler<Ping>
{public Task Handle(Ping notification, CancellationToken cancellationToken)
    {Debug.WriteLine($"Pong2, {DateTime.Now}");
        return Task.CompletedTask;
    }
}

3.1.3. 发送音讯告诉

// 基于 dotnet core 的依赖注入,注入 IMediator 对象
private readonly IMediator _mediator;
public HomeController(ILogger<HomeController> logger, IMediator mediator)
{
    _logger = logger;
    _mediator = mediator;
}


public async Task<IActionResult> IndexAsync()
{
    // e.g. 拜访首页时,发送告诉
    await _mediator.Publish(new Ping());
    return View();}

3.1.4. 输入

Pong1, 5/27/2021 4:37:18 PM
Pong2, 5/27/2021 4:37:18 PM

3.2. Request/Response 申请响应模式

request/response 用于命令和查问的场景。

3.2.1. 创立申请类:

public class RequestModel: IRequest<string>
{}

3.2.2. 创立申请解决类

不同于告诉模式,request/response 只能有一个申请解决。

public class RequestHandeler : IRequestHandler<RequestModel, string>
{public Task<string> Handle(RequestModel request, CancellationToken cancellationToken)
    {return Task.FromResult($"Pong {DateTime.Now}"); // 测试,返回内容给 request
    }
}

3.2.3. 页面中发送申请

private readonly ILogger<HomeController> _logger;
private readonly IMediator _mediator;

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

public async Task<IActionResult> IndexAsync()
{
    // send request, and show Response
    var response = await _mediator.Send(new RequestModel());
    Debug.WriteLine("Got response in controller:" +response);

    return View();}

3.2.4. 输入

Got response in controller: Pong 5/28/2021 2:04:26 PM

4. 总结

  • MediatR 是一种 过程内消息传递机制
  • 反对以同步或异步的模式进行申请 / 响应,命令,查问(CQRS),告诉和事件的消息传递,并通过 C# 泛型反对音讯的智能调度。
  • 其外围是音讯的解耦。
  • 利用场景: 实现 CQRS、EventBus 等。

5. 参考 & 代码

  • 参考: https://github.com/jbogard/MediatR
  • 代码: https://github.com/jackniu81/dotnet/tree/main/MediatR-Demo
正文完
 0