.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
扣费的下一级流程为生成订单即可
地址附上: