掌握ASP.NET Core MVC中的MediatR

摘要

MediatR是.NET中的中介者,它可以让我们在同步或异步的情况下,轻松地传递消息、指令、查询和通知。它就像一个无私的传话人,为我们的应用程序提供了便利和灵活性。

正文

ASP.NET Core MVC 新手入门到熟练 – 3. 应用MediatR

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

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录