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;
            }
    

    输出:

  • 相关阅读:
    (OK) error: code model kernel does not support PIC mode
    compile android for x86_64
    内核开发的前途在什么地方,发展方向有哪些?
    SOA 与 MSA(微服务架构)
    [Android] adb命令如何获取android手机屏幕分辨率
    (2) 在 Build 系统中添加新的内容
    (1) 理解 Android Build 系统
    (OK) [solved] error
    Error while building CM 13 (KERNEL_OBJ/usr, needed by libtinyalsa_intermediates/mixer.o)
    (OK) http://www.android-x86.org
  • 原文地址:https://www.cnblogs.com/q975261413/p/8609861.html
Copyright © 2011-2022 走看看