zoukankan      html  css  js  c++  java
  • .net 5+CQRS+MediatoR

    单播模式

    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("多播命令"));
    
            }
  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/smartsensor/p/15719922.html
Copyright © 2011-2022 走看看