天天看點

C# 搭建 MediatR 基本架構

INotificationHandler:INotification 多點傳播消息傳輸

多點傳播消息傳輸,也就是一對多的消息傳遞,一個消息對應多個消息處理。其通過INotification來抽象多點傳播消息,對應的消息處理類型為INotificationHandler。

IRequestHandler:單點傳播消息傳輸,也就是一對一的消息傳遞,一個消息對應一個消息處理。其通過IRequest來抽象單點傳播消息,用IRequestHandler進行消息處理。

感興趣的可以了解下:

MediatR 知多少: https://www.jianshu.com/p/583bcba352ec

  1. 安裝MediatR

    通過nuget的ui來安裝下面這兩個包:

    C# 搭建 MediatR 基本架構

2.在Startup類中配置MediatR

下一步,在Startup類中,在ConfigureServices方法中添加如下代碼:

C# 搭建 MediatR 基本架構
services.AddMediatR(Assembly.GetExecutingAssembly());
           

3.實作INotification

定義Class,引用INotification

C# 搭建 MediatR 基本架構
public class TESTUser : INotification
{
    public string Username { get; set; }
    public string Password { get; set; }
}
           

建立三個處理程式逐個執行,以完成他們的工作。這些都是從INotificationHandler繼承下來的

C# 搭建 MediatR 基本架構
public class TESTUserHandler : INotificationHandler<TESTUser>
{
    public Task Handle(TESTUser notification, CancellationToken cancellationToken)
    {
        //Save to log  
        Debug.WriteLine(" ****  Save user in database  *****");
        return Task.FromResult("");
    }
}


public class LogHandler : INotificationHandler<TESTUser>
{
    public Task Handle(TESTUser notification, CancellationToken cancellationToken)
    {
        //Save to log  
        Debug.WriteLine(" ****  User save to log  *****");
        return Task.FromResult("");
    }
}


public class EmailHandler : INotificationHandler<TESTUser>
{
    public Task Handle(TESTUser notification, CancellationToken cancellationToken)
    {
        //Send email  
        Debug.WriteLine(" ****  Email sent to user  *****");
        return Task.FromResult("");
    }
}
           

建立Controller引用IMediator實作對應方法,調用Publish方法實作

C# 搭建 MediatR 基本架構
[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
    private readonly IMediator _mediator;
    public HomeController(IMediator mediator)
    {
        _mediator = mediator;
    }


    [HttpGet]
    public ActionResult Register()
    {
        TESTUser user = new TESTUser() { Username = "test1", Password = "test2" };
        _mediator.Publish(user);
        return RedirectToAction("");
    }
}
           
  1. 實作IRequestHandler

    定義Class,引用IRequestHandler,定義傳回值

    C# 搭建 MediatR 基本架構
public class TESTUser2 : IRequest<bool>
{
    public string Username { get; set; }
    public string Password { get; set; }
}


public class TESTUser2Handler : IRequestHandler<TESTUser2, bool>
{
    public Task<bool> Handle(TESTUser2 request, CancellationToken cancellationToken)
    {
        // save to database  
        return Task.FromResult(true);
    }
}
           

建立Controller引用IMediator實作對應方法,調用Send方法實作

C# 搭建 MediatR 基本架構
_mediator.Send(user);
           

搭建架構參考 ASP.NET Core中使用MediatR實作指令和中介者模式:

https://blog.csdn.net/qin_yu_2010/article/details/83511366

英文原文:https://www.c-sharpcorner.com/article/command-mediator-pattern-in-asp-net-core-using-mediatr2/

源代碼下載下傳:https://download.csdn.net/download/u010194236/12673908

.NetCore MVC轉換成 .NetCore WebApi:

https://www.cnblogs.com/licm/p/12718604.html

PS:源代碼沒啥東西能别下就别下拉代碼已經都貼到上邊了,贈送一張女神圖檔

C# 搭建 MediatR 基本架構