.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的真实地址,上篇文章已经说了这 ...
随机推荐
- element-ui(vue)upload组件的http-request方法的使用
element-ui(vue)upload组件的http-request方法的使用 官方文档: http-request方法有一个默认的参数 content content 是一个object对象:里 ...
- nuxt.js使用scss
1>安装一些loader npm i node-sass sass-loader scss-loader --save-dev 2>在nuxt.config.js中配置(需要全局使用的sc ...
- c++运行程序 鼠标点击按钮 (c++)(windows)
简介 这是在黑漆漆的程序中,制造用户可点击的按钮,来决定程序下一步该作什么,的基本代码. 详解 头文件 <cstdio>和<windows.h> 结构体 //这不全别复制 st ...
- Android 对接硬件串口篇
简介:硬件设备有IC卡片,指压测试仪(测试脉搏信号.心率.血压),经过串口获取硬件设备发送的数据. 正文:第一步:获得硬件设备,应用市场下载串口调适软件,测试一下在Android环境下数据是否能正常获 ...
- Keras之对鸢尾花识别
Keras之队鸢尾花识别 任务目标 对鸢尾花数据集分析 建立鸢尾花的模型 利用模型预测鸢尾花的类别 环境搭建 pycharm编辑器搭建python3.* 第三方库 numpy pandas sklea ...
- 太实用了!自己动手写软件——我们的密码PJ器终于完成了
之前我们完成了密码破解工具的界面,今天我们来看看功能实现吧. 目录 编码 提交——功能实现 开始破解——功能实现 读取密码字典 选择协议并执行破解动作 POP3协议的破解函数 IMAP协议的破解函数 ...
- go test 测试用例那些事(二) mock
关于go的单元测试,之前有写过一篇帖子go test测试用例那些事,但是没有说go官方的库mock,很有必要单独说一下这个库,和他的实现原理. mock主要的功能是对接口的模拟,需要在写代码的时候定义 ...
- mybatis sqlsession与sqlsquery、transaction、connection
sqlsession和connection 一个sqlsession一般对应一个connection,并且mybatis默认每次获取session都会开启一个事务,且不自动提交事务.如果更新操作完成后 ...
- APP自动化 -- contexts(上下文切换)
一.上下文是什么? 1.解释 1)在混合型APP中包含了 原生页面 和 H5页面,如果需要进入APP内嵌的H5页面里面去操作就需要先切换进去,如果要继续回到原生页面操作就需要切回来. 2)这个就像是 ...
- 01 . Go框架之Beego简介部署及程序流程分析
Beego简介 beego是一个使用Go语言来开发WEB引用的GoWeb框架,该框架起始于2012年,由一位中国的程序员编写并进行公开,其目的就是为大家提供一个高效率的web应用开发框架.该框架采用模 ...