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

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

举个例子

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

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

我看见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 = ,
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

.net core编写转发服务(二) 添加服务发布订阅的更多相关文章

  1. ASP.NET Core中实现单体程序的事件发布/订阅

    标题:ASP.NET Core中实现单体程序的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10468058.html 项目源代码: ...

  2. .net core编写转发服务

    我有个小伙伴问我,他需要写一个转发服务的他有很多功能要通过他的服务转发~ 技术栈又不一定asp.net core,我就想起泥水老前辈的BeetleX.FastHttpApi 中午午休,折腾了一会儿前辈 ...

  3. .net core编写转发服务(三) 接入Polly

    在web服务里面,很常见出现各种问题,需要一些响应的策略,比如服务繁忙的时候,重试,或者重试等待 服务繁忙的时候根据策略即使处理 关于接入Polly我还是沿用之前的代码,继续迭代 Web Api用的是 ...

  4. Dapr + .NET Core实战(十二)服务调用之GRPC

    什么是GRPC gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的 ...

  5. 学习ASP.NET Core Razor 编程系列二——添加一个实体

    在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...

  6. Redis学习笔记(二十) 发布订阅(下)

    当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...

  7. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. spring cloud+dotnet core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  9. spring cloud+.net core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

随机推荐

  1. JS的数据类型你真的懂了吗

    一.JS数据类型分类 1.基本数据类型 (1)Number 数字 (2)String 字符串 (3)Boolean 布尔值 (4)null 空对象指针 (5)undefined 为定义 (6)symb ...

  2. js复制内容到剪贴板格式化粘贴到excel中

    <input id="Button1" type="button" value="导出EXCEL" onclick="cop ...

  3. JavaScript学习 Ⅵ (正则表达式)

    十三. 正则表达式 正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,将字符串中符合规则的内容提取出来. 创建正则表达式对象 构造函数 var reg = n ...

  4. 数据可视化之DAX篇(二十六)Power BI度量值:滚动聚合

    https://zhuanlan.zhihu.com/p/85996745 上一篇文讲了累计聚合,这篇文章继续讲一下滚动聚合,比如常用的MAT计算,Moving Annual Total,滚动年度总计 ...

  5. Java常用类-Object类

    一.java.lang.Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Obj ...

  6. 从JIT到类加载再到实现原理解式Lambda编译慢的问题

    问题回顾 描述的话不多说,直接上图: 看到输出结果了吗?为什么第一次和第二次的时间相差如此之多?咱们一起琢磨琢磨,也可以先去看看结论再回过头看分析 注:并非仅第二次快,而是除了第一次,之后的每一次都很 ...

  7. OSCP Learning Notes - Buffer Overflows(1)

    Introduction to Buffer Overflows Anatomy of Memory Anatomy of the Stack Fuzzing Tools: Vulnserver -  ...

  8. C++ 深搜调错

    因为前两天某网站的比赛一个深搜错了,我只得了3等奖,我找不到错误,给别的大佬看他们又嫌恶心.emm……,比赛结束后我自己反思了一下,深搜写错了该怎么办,或者说怎样避免写错. 首先,变量名不要太ex,比 ...

  9. JavaScript中的var,const,let区别与用法(浅谈)

    let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...

  10. web自动化 -- HTMLreport(一)测试报告自定义测试用例名,重写ddt

    一.需求痛点 1.HTMLreport测试报告的用例名不明确 2.希望可以自定义HTMLreport测试报告的用例名 3.痛点截图 二.解决办法 1.原因分析 HTMLreport测试报告中的用例名是 ...