zoukankan      html  css  js  c++  java
  • .net core编写转发服务(二) 添加服务发布订阅

    源设计就单纯完成了把服务转发到特定的服务模块,一定程度上解耦了业务流程

    但是我们实际开发过程中会面临服务转发后还有一些列关联的服务

    举个例子

    你调用了发送邮件的服务,接下来会面临扣费的服务,扣费之后会自动生成一个消费流水

    你看上去只做了一件事儿,但是实际上是一套业务流程流水线

    我看见Jeffcky大佬博客的一篇文章《EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

    看见了DiagnosticSource的发布订阅,随即折腾了一番,完成了我心目中的转发服务新版本

    新增了一个自动发布的基类

        public abstract class AbstractPublishService : IForwardService
        {
            private DiagnosticSource source;
    
            public AbstractPublishService()
            {
                var key = GetType().FullName;
    
                source = new DiagnosticListener(key);
            }
    
            public virtual async Task<object> PublishAsync(object param)
            {
                var response = await ExecuteAsync(param);
    
                source.Write("Publish", response);
    
                return response;
            }
    
            public abstract Task<object> ExecuteAsync(object param);
        }

    原本调用执行服务的部分修改为

                    if (service is AbstractPublishService publishService)
                    {
                        return await publishService.PublishAsync(entry);
                    }
                    else
                    {
                        return await service.ExecuteAsync(entry);
                    }

    入口调用的时候注册一下订阅

                var subscribe = new SubscribeService();
    
                subscribe.AddService<MaillService, OrderService>((response) =>
                {
                    if (response is bool checkResponse)
                    {
                        if (checkResponse)
                        {
                            return new OrderModel
                            {
                                Title = "Subscribe and Create Order",
                                PayMoney = 1,
                                CreateTime = DateTime.Now
                            };
                        }
                    }
    
                    return null;
                });
    
                DiagnosticListener.AllListeners.Subscribe(subscribe);

    把原本发送邮件的例子MaillServer的继承接口改为基类AbstractPublishService

    我们的订单服务部分代码如下

        public class OrderService : IForwardService
        {
            [ParamType(typeof(OrderModel))]
            public Task<object> ExecuteAsync(object param)
            {
                var orderParam = param as OrderModel;
                Console.WriteLine($"Title:{orderParam.Title} Money:{orderParam.PayMoney} CreateTime:{orderParam.CreateTime}");
    
                return Task.FromResult<object>(true);
            }
        }
    
        public class OrderModel
        {
            public string Title { get; set; }
            public decimal PayMoney { get; set; }
            public DateTime CreateTime { get; set; }
        }

    和之前一样,调用一下发送邮件接口

    这个服务之后会自动调用订单服务

    如果我们希望 发送邮件->扣费->订单生成

    那么实现一个扣费的服务即可,服务继承AbstractPublishService

    扣费的下一级流程为生成订单即可

    地址附上:

    https://github.com/htrlq/ForwardService

  • 相关阅读:
    asyncio异步IO--协程(Coroutine)与任务(Task)详解
    python爬虫实战:利用scrapy,短短50行代码下载整站短视频
    深入理解Git的实现原理
    Upsource 代码审查工具安装及使用
    MAC MAMP集成环境安装 PHP 扩展
    千万数据量数据表分表实践
    设计模式:序言
    设计模式 行为型
    PHP5底层原理之变量
    PHP5底层原理之垃圾回收机制
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/10844008.html
Copyright © 2011-2022 走看看