zoukankan      html  css  js  c++  java
  • 思考一种好的架构(十一)

    事件总线的使用

    短信服务(SMS Server)

    微信公众号(WeChat Server)

    事件回溯服务(TracingSource)

    短信服务:

     public interface ISMSOperation
        {
            void SendSMS(string message);
        }
     public class SMSOperation : ISMSOperation
        {
            public void SendSMS(string message)
            {
                Console.WriteLine($"发送短信:{message}");
            }
        }

    上面就是短信自己的业务服务

    它并没有引用中介者,也没把接口放在中介者,因为它有更加偏向于普通服务,虽然到最后可能也会做短信消息持久化,不过那个是NoSql的保存而不是主要业务库

     public class StartExecute : BaseStartExecute
        {
            public override void Execute()
            {
                EventBusPost.CreateEvent(typeof(Startup));
            }
        }
     public static class Startup
        {
            public static void ConfigureServices(IServiceCollection services)
            {
                services.AddTransient<ISMSOperation, SMSOperation>();
    
            }
    
            public static void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
             
            }
        }
    StartExecute 留在后续再说明
    这里的代码表示服务最开始启动时候就通过注入的方式通知EventBus扫描这个程序集,以便发现事件处理对象

    最后来到事件(消息)处理

      class OrderGenerationEventHandler:INotificationHandler<OrderGenerationEvent>
        {
            ISMSOperation operation;
            public OrderGenerationEventHandler(ISMSOperation operation) {
                this.operation = operation;
            }
            public Task Handle(OrderGenerationEvent notification, CancellationToken cancellationToken)
            {
                operation.SendSMS($"恭喜你下单成功,下单时间:{notification.GenerationTimer},数量{notification.Number}");
                return Task.CompletedTask;
            }
        }

    非常简单,监听订单生成事件,((OrderGenerationEvent)订单生成事件是在EventBus下定义的)

    然后获取ISMSOperation 功能,Handle处理时发送短信,简单明了

    微信公众号服务

    现在很简单,就一个模拟发送消息的功能

    它可能会需要引用到中介者服务中,对微信公众号的接入可能会导致它的服务被大量调用,但是它依旧属于普通服务,后续它可能会变得异常庞大,那那时就需要小心了,拆分的时候一定要保证服务最基本的原则

     public interface IWeChatNoticeOperation
        {
            void SendSMS(string message);
        }
     public void SendSMS(string message)
            {
                Console.WriteLine($"发送微信公众号消息:{message}");
            }
     public class StartExecute : BaseStartExecute
        {
            public override void Execute()
            {
                EventBusPost.CreateEvent(typeof(Startup));
            }
        }
    public static class Startup
        {
            public static void ConfigureServices(IServiceCollection services)
            {
                services.AddTransient<IWeChatNoticeOperation, WeChatNoticeOperation>();
            }
    
            public static void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
             
            }
        }
    class OrderGenerationEventHandler:INotificationHandler<OrderGenerationEvent>
        {
            IWeChatNoticeOperation operation;
            public OrderGenerationEventHandler(IWeChatNoticeOperation operation) {
                this.operation = operation;
            }
            public Task Handle(OrderGenerationEvent notification, CancellationToken cancellationToken)
            {
                operation.SendSMS($"恭喜你下单成功,下单时间:{notification.GenerationTimer},数量{notification.Number}");
                return Task.CompletedTask;
            }
        }

    很简单,就是上面那一套的翻版

    这节说了下事件总线的应用,下一节也附带了使用事件总线

  • 相关阅读:
    Windows系统开机硬盘自检问题解决
    更改软件默认安装路径
    windows添加开机启动项
    xp 如何打开(进行)远程桌面连接
    xp看系统位数
    教你创建一个别人打不开删不掉的文件夹(干坏事爱好者必看)
    无操作一段时间显示器无信号
    长时间用电脑,(给窗口选一个合适的颜色)设置窗口绿色
    Windows右键菜单设置与应用技巧
    Outlook如何定时发邮件
  • 原文地址:https://www.cnblogs.com/AnAng/p/12612377.html
Copyright © 2011-2022 走看看