.netcore grpc客户端工厂及依赖注入使用
一、客户端工厂概述
- gRPC 与
HttpClientFactory的集成提供了一种创建 gRPC 客户端的集中方式。 - 可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入
- AddGrpcClient函数提供了许多配置项用于处理一些其他事项;例如AOP、重试策略等
二、案例介绍
- 创建一个WPF客户端
- 在App.xaml.cs代码类里重写OnStartup方法,进行依赖注入;需要注意的是在方法内设立窗口调用需要把展示端属性 xmlns: StartupUri="FieldWindow.xaml 给去掉
- 引用ServiceCollection做为容器集
- 注入gRPC工厂,注入windows窗体,以及其他需要用到的服务类等
三、客户端代码展示
- proto文件 可以看我之前的文章这里就不放上来了
/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{protected override void OnStartup(StartupEventArgs e){IServiceCollection services = new ServiceCollection();// 注入services.AddWPFGrpc();AddWPFWindows(services);// 构建服务提供器var serviceProvider = services.BuildServiceProvider();var fieldWindow = serviceProvider.GetRequiredService<FieldWindow>();fieldWindow.Show();}private IServiceCollection AddWPFWindows(IServiceCollection services){if (services == null){throw new ArgumentNullException(nameof(services));}var windowType = typeof(Window);var types = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.BaseType == windowType).ToList();foreach (var type in types){services.AddScoped(type);}return services;}}
public static class GrpcClient{/// <summary>/// rpc 工厂注入/// </summary>/// <param name="services"></param>/// <returns></returns>public static IServiceCollection AddWPFGrpc(this IServiceCollection services){if (services == null){throw new ArgumentNullException(nameof(services));}services.AddGrpcClient<FieldRpc.FieldRpcClient>(options => options.Address = new Uri("https://localhost:7188"));return services;}}
/// <summary>/// FieldWindow.xaml 的交互逻辑/// </summary>public partial class FieldWindow : Window{private readonly FieldRpc.FieldRpcClient _fieldRpcClient;public FieldWindow( FieldRpc.FieldRpcClient fieldRpcClient){InitializeComponent();_fieldRpcClient = fieldRpcClient;}// 基础private async void BtnBaseconfig_Click(object sender, RoutedEventArgs e){// 基础BaseConfig config = new BaseConfig();config.Name = "张三";config.Position = 2.33D;config.Distance = 5.48F;config.Age = 10;config.TimeSpanId = 6538590027736100;config.SAge = 1921;config.STimeSpanId = 6538590027736130;config.Flag = true;await _fieldRpcClient.BaseConfigServiceAsync(config);MessageBox();}// 日期private async void BtnDateconfig_Click(object sender, RoutedEventArgs e){// 日期DateConfig dateConfig = new DateConfig();dateConfig.Id = 179;dateConfig.DateDuration = Google.Protobuf.WellKnownTypes.Duration.FromTimeSpan(TimeSpan.FromSeconds(5));// 注意这里的时间是utc时间dateConfig.DateTimestamp = Timestamp.FromDateTime(DateTime.UtcNow);await _fieldRpcClient.DateConfigServiceAsync(dateConfig);MessageBox();}// 字节private async void BtnByteconfig_Click(object sender, RoutedEventArgs e){// 字节ByteConfig byteConfig = new ByteConfig();byteConfig.Id = 9854564654654;byteConfig.PositionBytes = ByteString.CopyFrom(Encoding.UTF8.GetBytes("庄这人的南的很"));await _fieldRpcClient.ByteConfigServiceAsync(byteConfig);MessageBox();}// nullprivate async void BtnNullconfig_Click(object sender, RoutedEventArgs e){// nullNullConfig nullConfig = new NullConfig();nullConfig.Id = 1854564654654;nullConfig.NullBool = true;nullConfig.NullFloat = null;nullConfig.NullUInt = null;nullConfig.NullInt = 15;nullConfig.NullLong = 112345451234787;await _fieldRpcClient.NullConfigServiceAsync(nullConfig);MessageBox();}// listprivate async void BtnListconfig_Click(object sender, RoutedEventArgs e){// ListConfigListConfig listConfig = new ListConfig();var attributes = new Dictionary<int, string>{[1] = "one",[2] = "two",[3] = "three",[4] = "four",[5] = "five"};listConfig.Id = 123456456;listConfig.Attributes.Add(attributes);var dicDetail = new Dictionary<int, ListDetailConfig>{[1] = new ListDetailConfig { Height = 1, Name = "one" },[2] = new ListDetailConfig { Height = 2, Name = "two" },[3] = new ListDetailConfig { Height = 3, Name = "three" },[4] = new ListDetailConfig { Height = 4, Name = "four" },[5] = new ListDetailConfig { Height = 5, Name = "five" }};listConfig.DicDetail.Add(dicDetail);listConfig.Details.Add(new ListDetailConfig { Height = 8, Name = "Eight" });var detailConfigs = new List<ListDetailConfig>{new ListDetailConfig { Height=9,Name="nine"},new ListDetailConfig{ Height=10,Name="ten"}};listConfig.Details.Add(detailConfigs);await _fieldRpcClient.ListConfigServiceAsync(listConfig);MessageBox();}// anyprivate async void BtnAnyconfig_Click(object sender, RoutedEventArgs e){// AnyAnyConfig anyConfig = new AnyConfig();anyConfig.Id = 42564134;anyConfig.AnyObject = Any.Pack(new B { Id = 15 });await _fieldRpcClient.AnyConfigServiceAsync(anyConfig);MessageBox();}// Oneofprivate async void BtnOneofconfig_Click(object sender, RoutedEventArgs e){// OneofOneofConfig oneofConfig = new OneofConfig();oneofConfig.OA = new A { Id = 1 };//oneofConfig.OC = new C { Id = 2 };await _fieldRpcClient.OneofConfigServiceAsync(oneofConfig);MessageBox();}private void MessageBox(){string messageBoxText = "执行完成";string caption = "HELLO";MessageBoxButton button = MessageBoxButton.OK;MessageBoxImage icon = MessageBoxImage.Information;MessageBoxResult result = System.Windows.MessageBox.Show(messageBoxText, caption, button, icon);}}
四、执行效果展示
客户端:

服务端:

五、源码地址
链接:https://pan.baidu.com/s/1FQY7QOgF8Y90igKV56Yupg
提取码:mbyg
下一篇
https://blog.csdn.net/qq_31975127/article/details/132346657
相关文章:
.netcore grpc客户端工厂及依赖注入使用
一、客户端工厂概述 gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入AddGrpcClient函数提供了许多配置项用于处理一些其他事项;例如AOP、重试策略等 二、案…...
C语言入门_Day7 逻辑运算
目录: 前言 1.逻辑运算 2.优先级 3.易错点 4.思维导图 前言 算术运算用来进行数据的计算和处理;比较运算是用来比较不同的数据,进而来决定下一步怎么做;除此以外还有一种运算叫做逻辑运算,它的应用场景也是用来影…...
什么是Eureka?以及Eureka注册服务的搭建
导包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…...
Docker安装并配置镜像加速器,镜像、容器的基本操作
目录 1.安装docker服务,配置镜像加速器 (1)安装依赖的软件包 (2)设置yum源,我配置的阿里仓库 (3)选择一个版本安装 (4)启动docker服务,并设置…...
前端 -- 基础 网页、HTML、 WEB标准 扫盲详解
什么是网页 : 网页是构成网站的基本元素,它通常由 图片、链接、文字、声音、视频等元素组成。 通常我们看到的网页 ,常见以 .html 或 .htm 后缀结尾的文件, 因此俗称 HTML 文件 什么是 HTML : HTML 指的是 超文本标记语言,…...
分布式锁实现方式
分布式锁 1 分布式锁介绍 1.1 什么是分布式 一个大型的系统往往被分为几个子系统来做,一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上,也可以部署在多台机器上。但是每一个系统不是独立的,不是完全独立的。需要相互通信ÿ…...
C语言小练习(一)
🌞 “人生是用来体验的,不是用来绎示完美的,接受迟钝和平庸,允许出错,允许自己偶尔断电,带着遗憾,拼命绽放,这是与自己达成和解的唯一办法。放下焦虑,和不完美的自己和解…...
Flask-flask系统运行后台轮询线程
对于有些flask系统,后台需要启动轮询线程,执行特定的任务,以下是一个简单的例子。 globals/daemon.py import threading from app.executor.ops_service import find_and_run_ops_task_todo_in_redisdef context_run_func(app, func):with …...
jsp本质-servlet
jsp本质-servlet 一、jsp文件 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>JSP Example…...
回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基…...
科技资讯|苹果Vision Pro新专利曝光:可调节液态透镜
苹果公司近日申请了名为“带液态镜头的电子设备”,概述了未来可能的头显设计。头显设备中的透镜采用可调节的液态透镜,每个透镜可以具有填充有液体的透镜腔,透镜室可以具有形成光学透镜表面的刚性和 / 或柔性壁。 包括苹果自家的 Vision Pr…...
神经网络基础-神经网络补充概念-38-归一化输入
概念 归一化输入是一种常见的数据预处理技术,旨在将不同特征的取值范围映射到相似的尺度,从而帮助优化机器学习模型的训练过程。归一化可以提高模型的收敛速度、稳定性和泛化能力,减少模型受到不同特征尺度影响的情况。 常见的归一化方法 …...
【Redis】什么是缓存雪崩,如何预防缓存雪崩?
【Redis】什么是缓存雪崩,如何预防缓存雪崩? 如果缓存集中在一段时间内失效,也就是通常所说的热点数据集中失效 (一般都会给缓存设定一个失效时间,过了失效时间后,该数据库会被缓存直接删除,从…...
[国产MCU]-W801开发实例-开发环境搭建
W801开发环境搭建 文章目录 W801开发环境搭建1、W801芯片介绍2、W801芯片特性3、W801芯片结构4、开发环境搭建1、W801芯片介绍 W801芯片是联盛德微电子推出的一款高性价比物联网芯片。 W801 芯片是一款安全 IoT Wi-Fi/蓝牙 双模 SoC芯片。芯片提供丰富的数字功能接口。支持2.…...
区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测
区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测。基于分位…...
改善神经网络——优化算法(mini-batch、动量梯度下降法、Adam优化算法)
改善神经网络——优化算法 梯度下降Mini-batch 梯度下降(Mini-batch Gradient Descent)指数加权平均包含动量的梯度下降RMSprop算法Adam算法 优化算法可以使神经网络运行的更快,机器学习的应用是一个高度依赖经验的过程,伴随着大量…...
大数据面试题:Spark的任务执行流程
面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答:1)Spark的工作流程?2)Spark的调度流程;3)Spark的任务调度原理…...
通过 Amazon SageMaker JumpStart 部署 Llama 2 快速构建专属 LLM 应用
来自 Meta 的 Llama 2 基础模型现已在 Amazon SageMaker JumpStart 中提供。我们可以通过使用 Amazon SageMaker JumpStart 快速部署 Llama 2 模型,并且结合开源 UI 工具 Gradio 打造专属 LLM 应用。 Llama 2 简介 Llama 2 是使用优化的 Transformer 架构的自回归语…...
ansible远程执行命令
一、ansible简介 需要在一台机器上搭建ansible环境,且配置目的ip的密码,通道没有问题即可下发命令 使用的通道是ssh(端口:36000) 二、搭建细节 1、安装ansible yum install -y ansible 2、把目的ip密码写到配置…...
Windows快速恢复丢失的颜色校准
场景 有时开机或启动某个软件后,颜色校准(设置项:校准显示器颜色)会丢失,每次重新设置很麻烦。 文章首发及后续更新:https://mwhls.top/4723.html,无图/无目录/格式错误/更多相关请至首发页查看…...
STM32F407+UCOSIII实战:手把手教你从零搭建一个能走会避障的六足机器人(附完整源码/PCB/Solidworks图纸)
STM32F407UCOSIII实战:从零构建智能六足机器人全流程解析 六足机器人作为仿生机器人中的经典形态,其稳定性和地形适应能力远超轮式与四足结构。本文将带你完整实现一个基于STM32F407和UCOSIII的智能六足机器人,涵盖机械设计、电路开发、运动…...
APKMirror客户端:安卓应用安全下载与管理的革新方案
APKMirror客户端:安卓应用安全下载与管理的革新方案 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 在安卓应用获取的过程中,用户常常面临两难选择:官方应用商店的更新滞后与第三方平台的安全隐…...
从RS-485到MQTT:手把手教你为BMS Modbus设备搭建物联网网关(Node-RED实战)
从RS-485到MQTT:手把手教你为BMS Modbus设备搭建物联网网关(Node-RED实战) 当工业现场的BMS设备还在使用Modbus-RTU协议时,如何让这些"信息孤岛"融入现代物联网架构?这个问题困扰着许多能源管理系统工程师。…...
革新性暗黑破坏神2存档管理开源工具:d2s-editor全功能解析
革新性暗黑破坏神2存档管理开源工具:d2s-editor全功能解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2存档修改门槛高?复杂二进制格式难以操作?d2s-editor作为免费开源的Web端…...
基于DAMOYOLO-S与计算机网络技术:构建分布式视频分析集群
基于DAMOYOLO-S与计算机网络技术:构建分布式视频分析集群 想象一下,一个大型物流园区,上百个摄像头日夜不停地运转,管理者需要实时知道:哪条通道拥堵了?哪个区域有异常人员闯入?传统的监控方式…...
Qwen3-ASR-1.7B多说话人分离展示:会议录音自动分角色
Qwen3-ASR-1.7B多说话人分离展示:会议录音自动分角色 会议记录不再需要人工分辨谁说了什么,AI现在能帮你自动区分每个发言人 1. 引言 想象一下这样的场景:一场两小时的多人会议刚刚结束,你需要整理会议纪要。传统的做法是反复听录…...
从数据集到GUI应用:手把手教你用YOLOv11训练自己的手势识别模型(保姆级教程)
从数据集到GUI应用:手把手教你用YOLOv11训练自己的手势识别模型(保姆级教程) 在计算机视觉领域,手势识别技术正逐渐从实验室走向实际应用。无论是智能家居控制、虚拟现实交互,还是无障碍通信系统,准确快速的…...
Mac新手必看:保姆级教程教你用阿里源加速Homebrew安装(附一键脚本)
Mac新手必备:用阿里云镜像极速部署Homebrew全攻略 刚入手MacBook的你,可能正摩拳擦掌准备搭建开发环境。但当你在终端输入brew install python后,进度条却像蜗牛爬行——这不是你的网络问题,而是Homebrew默认从GitHub拉取资源时&a…...
基于GPT-5.4的本科毕业论文智能写作实战指南:从实验数据到完稿的全流程教程
摘要: 对于已完成实验并手握参考文献的大四学生而言,将 months of experiments 转化为符合学术规范的毕业论文往往是最具挑战性的环节。本教程系统介绍如何利用GPT-5.4这一先进的大语言模型,通过科学的提示词工程(Prompt Engineer…...
程序员成长之路:从技术热爱到工程艺术
1. 程序人生:从技术热爱到工程艺术1.1 技术启蒙与早期实践1987年进入武汉大学计算机系标志着一段技术人生的开始。最初接触的是Motorola 68000处理器系统,配置540KB内存,运行UNIX操作系统。这种八人共享的计算环境成为编程技术的第一课堂。大…...
