• .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

  • 相关阅读:
    洛谷 P2473 [SCOI2008]奖励关(状压dp+期望)
    洛谷P2051 [AHOI2009]中国象棋(dp)
    洛谷P2523 [HAOI2011]Problem c(计数dp)
    牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)
    POJ1149 PIGS
    CF802C Heidi and Library (hard)
    struts中请求数据自动封装
    struts 中数据处理的3中方式
    ajax第二天学习
    jstl标签
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/10844008.html
Copyright © 2020-2023  润新知