进程内通信框架-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);
        }
    }
}
posted @ 2024-08-14 16:18  [在河之洲]  阅读(69)  评论(0)    收藏  举报