MediatR一個優秀的.NET中介者框架


1 前置閱讀

在閱讀本文章之前,你可以先閱讀:

  • 什么是中介者模式

2 簡介

.NET中的簡單中介者模式實現,一種進程內消息傳遞機制(無其他外部依賴)。 支持以同步或異步的形式進行請求/響應,命令,查詢,通知和事件的消息傳遞,並通過C#泛型支持消息的智能調度。

MediatR可以支持幾種模式:請求/響應模式與發布模式。

3 請求/響應模式的使用

請求/響應模式,也可以叫做命令模式,是一對一的消息傳遞,一個消息對應一個消息處理。

首先,將MediatR,MediatR.Extensions.Microsoft.DependencyInjection的NuGet軟件包安裝到您的應用程序中。

MediatR
MediatR.Extensions.Microsoft.DependencyInjection

然后,我們通過Startup.ConfigureServices增加AddMediatR來注冊組件。

services.AddMediatR(typeof(TenantRequestHandler).Assembly);

接着,定義消息類。

namespace MediatR.WebApi
{
    public class TenantRequest : IRequest<string>
    {
        public TenantRequest(string message)
        {
            Message = message;
        }
        public string Message { get; }
    }
}

接着,定義消息處理類。

using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace MediatR.WebApi
{
    public class TenantRequestHandler : IRequestHandler<TenantRequest, string>
    {
        private readonly ILogger<TenantRequestHandler> logger;
        public TenantRequestHandler(ILogger<TenantRequestHandler> logger)
        {
            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }

        public Task<string> Handle(TenantRequest request, CancellationToken cancellationToken)
        {
            logger.LogInformation($"Handled: {request.Message}");
            return Task.FromResult(request.Message);
        }
    }
}

最后,創建HomeController,發布請求

using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;

namespace MediatR.WebApi.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class HomeController : Controller
    {
        private readonly IMediator mediator;
        public HomeController(IMediator mediator)
        {
            this.mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
        }

        [Route("Example01")]
        [HttpGet]
        public async Task<IActionResult> Example01()
        {
            await mediator.Send(new TenantRequest { Message= "通知房客信息" });
            return Ok();
        }
    }
}

項目中跟蹤會輸出:

Handled: 通知房客信息

4 發布模式的使用

發布模式,是一對多的消息傳遞,一個消息對應多個消息處理。

安裝及注冊組件后,首先,定義消息類。

namespace MediatR.WebApi
{
    public class LandlordNotification : INotification
    {
        public LandlordNotification(string message)
        {
            Message = message;
        }
        public string Message { get; }
    }
}

接着,定義消息處理類。

using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace MediatR.WebApi
{
    public class LandlordNotificationHandler : INotificationHandler<LandlordNotification>
    {
        private readonly ILogger<LandlordNotificationHandler> logger;
        public LandlordNotificationHandler(ILogger<LandlordNotificationHandler> logger)
        {
            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }

        public Task Handle(LandlordNotification notification, CancellationToken cancellationToken)
        {
            logger.LogInformation($"Handled: {notification.Message}");
            return Task.CompletedTask;
        }
    }
}

最后,在HomeController,增加發布請求

[Route("Example02")]
[HttpGet]
public async Task<IActionResult> Example02()
{
    await mediator.Publish(new LandlordNotification("通知房東信息"));
    return Ok();
}

項目中跟蹤會輸出:

Handled: 通知房東信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM