进程内通信框架-MediatR
MediatR
MediatR是一款进程内通信框架,支持发布到单个处理程序(send)与多个处理程序(publish).
简单点理解:
Request/Response模式(Send):订阅-发布,一对一处理,即使有多个同样的订阅但执行只有一个,可以有返回值(IRequest-IRequestHandler)
Notifictaion模式(publish):广播,只要订阅,即执行。无返回值(INotification-INoticifaitonHandler)
准备
- nuget install MediatR
- 依赖注入
//以winform程序为演示.引入了Microsoft.Extensions.Hosting、NLog、NLog.Extensions.Logging
//MediatR.Service.dll 、MediatR.UserControls.dll 分别有处理handl
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
namespace MediatR.Winform
{
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
ServiceCollection services = new ServiceCollection();
ConfigureServices(services);
ServiceProvider serviceProvider = services.BuildServiceProvider();
var formMain = serviceProvider.GetRequiredService<Form1>();
Application.Run(formMain);
}
private static void ConfigureServices(ServiceCollection services)
{
services.AddScoped<Form1>();
IConfigurationBuilder cfgBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("Appsetting.json", true, true);
IConfiguration configuration = cfgBuilder.Build();
services.AddSingleton(configuration);
services.AddMediatR(mr =>
{
mr.RegisterServicesFromAssemblies(typeof(Program).Assembly,
Assembly.LoadFrom("MediatR.Service.dll"),
Assembly.LoadFrom("MediatR.UserControls.dll")
);
});
services.AddLogging((log =>
{
log.ClearProviders();
log.AddNLog(configuration);
log.SetMinimumLevel(LogLevel.Information);
}));
}
}
}
Request/Response模式(Send)
消息体
// **IRequest**
namespace MediatR.Common
{
public class Info : IRequest
{
public string Msg { get; set; }
}
}
发布
namespace MediatR.Winform
{
public partial class Form1 : Form
{
private readonly IMediator mediator;
public Form1(IMediator mt)
{
InitializeComponent();
mediator = mt;
}
private void button1_Click(object sender, EventArgs e)
{
var info = new InfoDemo()
{
Msg = "hello world"
};
mediator.Publish(info);
}
private void button2_Click(object sender, EventArgs e)
{
var info=new Info() { Msg = "abcdef" };
mediator.Send(info);
}
}
}
处理
namespace MediatR.Service
{
public class InfoHandler : IRequestHandler<Info>
{
public Task Handle(Info request, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}
Notifictaion模式(publish)
消息体
// **INotification**
namespace MediatR.Common
{
public class InfoDemo : INotification
{
public string Msg { get; set; }
}
}
发布
var info = new InfoDemo()
{
Msg = "hello world"
};
mediator.Publish(info);
处理
namespace MediatR.Service
{
public class InfoDemoHandler1 : INotificationHandler<InfoDemo>
{
/// <summary>
///
/// </summary>
/// <param name="notification"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task Handle(InfoDemo notification, CancellationToken cancellationToken)
{
return Task.FromResult(notification.Msg);
}
}
}
努力到无能为力,拼搏到感动自己

浙公网安备 33010602011771号