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

  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/10844008.html
Copyright © 2011-2022 走看看