.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

原文地址:https://www.cnblogs.com/NCoreCoder/p/10844008.html