zoukankan      html  css  js  c++  java
  • Mediator 基于内存的发布订阅

    Github Mediator

    使用方法

        /// <summary>
        /// 返回值 BaseEntity
        /// </summary>
        public class Ping1 : IRequest<BaseEntity>
        {
            public string Name { get; set; }
            public int Val { get; set; }
        }
    
        /// <summary>
        /// 不带返回值
        /// </summary>
        public class Ping2 : IRequest
        {
            public string Name { get; set; }
            public int Val { get; set; }
        }
    
        public class BaseEntity
        {
            public bool Flag { get; set; }
            public int Val { get; set; }
        }
    
        public class PingHandler1 : IRequestHandler<Ping1, BaseEntity>
        {
            public Task<BaseEntity> Handle(Ping1 request, CancellationToken cancellationToken)
            {
                Console.WriteLine("传入值 {0} .带有返回值", request.Val);
                return Task.FromResult(new BaseEntity() { Val = request.Val * 2 });
            }
        }
    
        public class PingHandler2 : IRequestHandler<Ping2>
        {
            public Task Handle(Ping2 message, CancellationToken cancellationToken)
            {
                Console.WriteLine("传入值 {0} .不带返回值", message.Val);
                return Task.FromResult("");
            }
        }
    
            static void Main(string[] args)
            {
    
                DoAsync();
                Console.ReadLine();
            }
            public static async void DoAsync()
            {
                var mediator = BuildMediator();
    
                var response = await mediator.Send(new Ping1 { Val = 666 });
    
                Console.WriteLine("传出值 {0} .", response.Val);
    
                await mediator.Send(new Ping2 { Val = 666 });
    
                Console.ReadLine();
            }
    
            private static IMediator BuildMediator()
            {
                var builder = new ContainerBuilder();
                builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();//注册IMediator自身的组件
    
                var mediatrOpenTypes = new[]
                {
                    typeof(IRequestHandler<,>),
                    typeof(IRequestHandler<>),
                    typeof(INotificationHandler<>),
                };
    
                foreach (var mediatrOpenType in mediatrOpenTypes)
                {
                    //
                    //builder
                    //    .RegisterAssemblyTypes(typeof(Ping).GetTypeInfo().Assembly)
                    //    .AsClosedTypesOf(mediatrOpenType)
                    //    .AsImplementedInterfaces();
                    builder
                    .RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                    .AsClosedTypesOf(mediatrOpenType)
                    .AsImplementedInterfaces();
                }
    
                // It appears Autofac returns the last registered types first 显示指定泛型解析
                //builder.RegisterGeneric(typeof(RequestPostProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
                //builder.RegisterGeneric(typeof(RequestPreProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
                //builder.RegisterGeneric(typeof(GenericRequestPreProcessor<>)).As(typeof(IRequestPreProcessor<>));
                //builder.RegisterGeneric(typeof(GenericRequestPostProcessor<,>)).As(typeof(IRequestPostProcessor<,>));
                //builder.RegisterGeneric(typeof(GenericPipelineBehavior<,>)).As(typeof(IPipelineBehavior<,>));
                //builder.RegisterGeneric(typeof(ConstrainedRequestPostProcessor<,>)).As(typeof(IRequestPostProcessor<,>));
                //builder.RegisterGeneric(typeof(ConstrainedPingedHandler<>)).As(typeof(INotificationHandler<>));
    
                builder.Register<SingleInstanceFactory>(ctx =>
                {
                    var c = ctx.Resolve<IComponentContext>();
                    return t => c.Resolve(t);
                });
    
                builder.Register<MultiInstanceFactory>(ctx =>
                {
                    var c = ctx.Resolve<IComponentContext>();
                    return t => (IEnumerable<object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(t));
                });
    
                var container = builder.Build();
    
                // The below returns:
                //  - RequestPreProcessorBehavior
                //  - RequestPostProcessorBehavior
                //  - GenericPipelineBehavior
    
                //var behaviors = container
                //    .Resolve<IEnumerable<IPipelineBehavior<Ping, Pong>>>()
                //    .ToList();
    
                var mediator = container.Resolve<IMediator>();
    
                return mediator;
            }
    

    输出:

  • 相关阅读:
    python导入requests库一直报错原因总结 (文件名与库名冲突)
    Windows下,python pip安装时ReadTimeoutError解决办法
    win10家庭版怎么开启Administrator超级管理员帐户
    关于Centos7 firewalld防火墙开放端口后仍不能访问ftp和nginx的问题解决
    Nginx下配置ThinkPhp多入口访问
    phpStudy配置站点 解决You don't have permission to access / on this server
    非微信内置浏览器中的网页调起微信支付的方案研究
    两种解决方法 PHP Warning: File upload error
    chrome浏览器的跨域设置——包括版本49前后两种设置
    ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信
  • 原文地址:https://www.cnblogs.com/q975261413/p/8609861.html
Copyright © 2011-2022 走看看