.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 = ,
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编写转发服务(二) 添加服务发布订阅的更多相关文章
- ASP.NET Core中实现单体程序的事件发布/订阅
标题:ASP.NET Core中实现单体程序的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10468058.html 项目源代码: ...
- .net core编写转发服务
我有个小伙伴问我,他需要写一个转发服务的他有很多功能要通过他的服务转发~ 技术栈又不一定asp.net core,我就想起泥水老前辈的BeetleX.FastHttpApi 中午午休,折腾了一会儿前辈 ...
- .net core编写转发服务(三) 接入Polly
在web服务里面,很常见出现各种问题,需要一些响应的策略,比如服务繁忙的时候,重试,或者重试等待 服务繁忙的时候根据策略即使处理 关于接入Polly我还是沿用之前的代码,继续迭代 Web Api用的是 ...
- Dapr + .NET Core实战(十二)服务调用之GRPC
什么是GRPC gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的 ...
- 学习ASP.NET Core Razor 编程系列二——添加一个实体
在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...
- Redis学习笔记(二十) 发布订阅(下)
当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...
- 学习ASP.NET Core Razor 编程系列十——添加新字段
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- spring cloud+.net core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
随机推荐
- 利用SignalR实施响应股票数据波动
1.新建ASP.NET Web应用程序, 选择Empty模板. 2.创建Stock.cs类 public class Stock { /// <summary> /// 价格 /// & ...
- 如何使用CSS3 调节 tab的高度
包含大量代码的网页(比如文档或教程)在样式上面对着无法回避的挑战.我们通常使用 <pre> 和 <code> 元素来显示代码,它们具有浏览器所赋予的默认样式.这些默认样式往往是 ...
- day41 几个琐碎知识点
目录 一.死锁与递归锁(了解) 1 死锁 2 递归锁 二.信息量 三.Event事件 四.三种优先级数据操作 1 队列 2 堆栈 3 自定义优先级 五.进程池和线程池 基本使用 六.协程 七.geve ...
- vue中v-model父子组件通信
有这样的需求,父组件绑定v-model,子组件输入更改父组件v-model绑定的数值.是怎么实现的呢? 实际上v-model 只是语法糖而已. <input v-model="inpu ...
- [系列] Go - json.Unmarshal 遇到的小坑
1.问题现象描述 使用 json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下: jsonStr := `{"number":1234567}` result ...
- 问题:IE11下window.history.go(-1)返回404
解决方法: 在后面添加return false,如: onclick="javascript:window.history.go(-1);return false" 这个问题在IE ...
- 基于Python的HTTP接口自动化测试框架实现
今天我们来讲一下基于Python的HTTP接口自动化测试框架的实现,范例如下: 一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值 输出:XML文件 e ...
- 获取字符串指定字符的第n次出现位置
create function uf_findx (@text nvarchar(max),@find_x varchar(200),@find_n int)returns intasbegin -- ...
- Sharding-Proxy的基本功能使用
Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端.作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置.它的整体架构图如下: 在架 ...
- Html笔试复习
掌握学习技巧,提高学习质量 学习目标:熟练掌握Html笔试复习题 已掌握目标:Html笔试复习题掌握95% 未完成目标:个别题因粗心造成错误,因选项意思不懂出错 解决方案:了解原因,因错出方案,充分利 ...