单播模式
NuGet引用库
MediatR
MediatR.Extensions.Microsoft.DependencyInjection
Microsoft.Extensions.DependencyInjection
Newtonsoft.Json 非必须,用来测试使用
创建测试实体类
public class User { public string Name { get; set; } }
1 封装命令和查询消息接口
/// <summary> /// 命令消息接口 /// </summary> /// <typeparam name="T"></typeparam> public interface ICommand<T> : IRequest<T> { }
/// <summary> /// 查询消息接口 /// </summary> /// <typeparam name="T"></typeparam> public interface IQuery<T>:IRequest<T> { }
2 创建单播请求命令和查询消息
/// <summary> /// 创建单播命令消息请求 /// </summary> public class CreateObject : ICommand<string> { //可以自定义任意的字段 public string Title { get; private set; } public string Content { get; private set; } public CreateObject(string title,string content) { Title = title.Trim(); Content = content.Trim(); } }
/// <summary> /// 创建单播查询消息请求 /// </summary> public class QueryObject : IQuery<User> { public string Name { get; private set; } public QueryObject(string name) { Name = name.Trim(); } }
3 创建单播命令和查询消息处理类
/// <summary> /// 处理命令消息的类 /// 继承IRequestHandler /// </summary> public class CommandHandler : IRequestHandler<CreateObject, string> { public Task<string> Handle(CreateObject request, CancellationToken cancellationToken) { Console.WriteLine($"执行单播命令 CreateObject...Title:{request.Title},Content:{request.Content}" ); return Task.FromResult("ok"); } }
/// <summary> /// 处理查询消息的类 /// </summary> public class QueryHandler : IRequestHandler<QueryObject, User> { public Task<User> Handle(QueryObject request, CancellationToken cancellationToken) { Console.WriteLine($"执行单播命令的query,{request.Name}"); return Task.FromResult(new User() { Name = "哈利波特" }); } }
4 创建测试类
async static Task Main(string[] args) { //发送单播请求 //使用中介者发送单播消息 var services = new ServiceCollection(); services.AddMediatR(typeof(Program).Assembly); var serviceProvider = services.BuildServiceProvider(); var mediator = serviceProvider.GetService<IMediator>(); var createResult = await mediator.Send(new CreateObject("命令1", "哈利波特骑着扫帚飞")); Console.WriteLine($"CreateObject 命令结果为{createResult}"); var queryResult = await mediator.Send(new QueryObject("哈利波特")); Console.WriteLine($"QueryObject 查询结果为{JsonConvert.SerializeObject(queryResult)}"); }
多播模式
1 创建多播消息
/// <summary> /// 构建多播消息 /// </summary> public class Ping : INotification { public string Name { get; private set; } public Ping(string name) { Name = name.Trim(); } }
2 创建两个不同的消息处理类
/// <summary> /// 消息处理器1 /// </summary> public class Ping1Handler : INotificationHandler<Ping> { public Task Handle(Ping notification, CancellationToken cancellationToken) { Console.WriteLine($"{notification.Name} 多播消息处理 1"); return Task.CompletedTask; } }
/// <summary> /// 消息处理器2 /// </summary> public class Ping2Handler : INotificationHandler<Ping> { public Task Handle(Ping notification, CancellationToken cancellationToken) { Console.WriteLine($"{notification.Name} 多播消息处理 2"); return Task.CompletedTask; } }
3 创建多播测试类
async static Task Main(string[] args) { //多播处理 await mediator.Publish(new Ping("多播命令")); }