.netcore grpc客户端工厂及依赖注入使用

这篇具有很好参考价值的文章主要介绍了.netcore grpc客户端工厂及依赖注入使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、客户端工厂概述

  1. gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。
  2. 可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入
  3. AddGrpcClient函数提供了许多配置项用于处理一些其他事项;例如AOP、重试策略等

二、案例介绍

  1. 创建一个WPF客户端
  2. 在App.xaml.cs代码类里重写OnStartup方法,进行依赖注入;需要注意的是在方法内设立窗口调用需要把展示端属性  xmlns: StartupUri="FieldWindow.xaml 给去掉
  3. 引用ServiceCollection做为容器集
  4. 注入gRPC工厂,注入windows窗体,以及其他需要用到的服务类等

三、客户端代码展示

  1. 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();
        }

        // null
        private async void BtnNullconfig_Click(object sender, RoutedEventArgs e)
        {

            // null
            NullConfig 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();
        }

        // list
        private async void BtnListconfig_Click(object sender, RoutedEventArgs e)
        {
            // ListConfig
            ListConfig 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();
        }

        // any
        private async void BtnAnyconfig_Click(object sender, RoutedEventArgs e)
        {
            // Any
            AnyConfig anyConfig = new AnyConfig();
            anyConfig.Id = 42564134;

            anyConfig.AnyObject = Any.Pack(new B { Id = 15 });

            await _fieldRpcClient.AnyConfigServiceAsync(anyConfig);
            
            MessageBox();
        }

        // Oneof
        private async void BtnOneofconfig_Click(object sender, RoutedEventArgs e)
        {

            // Oneof
            OneofConfig 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);
        }
    }

四、执行效果展示

客户端:

.netcore grpc客户端工厂及依赖注入使用,.netcore上的GRPC详解,.netcore

 服务端:

.netcore grpc客户端工厂及依赖注入使用,.netcore上的GRPC详解,.netcore

 五、源码地址

链接:https://pan.baidu.com/s/1FQY7QOgF8Y90igKV56Yupg 
提取码:mbyg

下一篇https://blog.csdn.net/qq_31975127/article/details/132346657文章来源地址https://www.toymoban.com/news/detail-662503.html

到了这里,关于.netcore grpc客户端工厂及依赖注入使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 不依赖docker客户端导出docker镜像

    此项目已经开源发布至GitHub https://github.com/DockerContainerService/image-save 1、支持linux、windows的amd64、arm64架构机器 2、支持不安装docker客户端情况下导出镜像tar包 3、支持公开镜像仓库/私有镜像仓库 4、支持多线程加速下载镜像 5、支持使用自定义镜像源加速下载镜像 大家在使用过

    2023年04月08日
    浏览(31)
  • netCore使用依赖注入

    依赖注入是一种常用的设计模式,用于解耦组件之间的依赖关系。通过依赖注入,我们可以将一个组件所依赖的其他组件的创建和管理工作交给容器来完成,从而实现组件之间的解耦和灵活性 .NET Core提供了内置的依赖注入容器,使我们能够轻松地实现依赖注入。下面是使用依

    2024年02月16日
    浏览(28)
  • 基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡

    本文主要讨论通过grpc-java开发的普通的java grpc工程,以多实例的方式部署在容器编排平台kubernetes(以下简称k8s)上,如何能够实现让同样部署在k8s 集群内的客户端请求流量均衡的分发到多个grpc应用部署实例上去。 grpc服务端程序在k8s内部署的多个实例通过headless service暴露服

    2024年01月17日
    浏览(37)
  • 杨中科 .netcore 依赖注入

    生活中的“控制反转”:自己发电和用电网的电。 依赖注入(Dependency Injection,Dl)是控制反转:(Inversion of Control,l0c)思想的实现方式。 依赖注入简化模块的组装过程,降低模块之间的耦合度 缺点是? 你需要对一切流程很清楚。 \\\'怎样创建XX对象”----“我要XX对象 两种实现方式:

    2024年02月21日
    浏览(20)
  • 【NetCore】03-依赖注入

    管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 依赖注入框架提供了对象创建和生命周期管理的核心能力,各个组件相互协作,也是由依赖注入框架的能力来实现的 组件包 Microsoft.Extensions.DependencyInjection.Abstractions Microsoft.Extensions.

    2024年02月15日
    浏览(30)
  • Redis的Java客户端-Java客户端以及SpringDataRedis的介绍与使用

    Spring Data Redis底层支持同时兼容Jedis和Lettuce两种不同的Redis客户端,可以根据需要任意选择使用其中的一种。这样既可以保留现有代码使用的Jedis方式,也可以通过使用基于Netty的高性能Lettuce客户端,提升应用的性能和吞吐量。 Jedis是一个传统的Java Redis客户端,使用BIO进行So

    2024年02月08日
    浏览(35)
  • Kafka-客户端使用

    Kafka提供了两套客户端API,HighLevel API和LowLevel API。 HighLevel API 封装了kafka的运行细节,使用起来比较简单,是企业开发过程中最常用的客户端API。 LowLevel API则需要客户端自己管理Kafka的运行细节,Partition,Offset这些数据都由客户端自行管理。这层API功能更灵活,但是使用起来

    2024年02月22日
    浏览(39)
  • 03-Zookeeper客户端使用

    上一篇:02-Zookeeper实战 zookeeper 官方的客户端没有和服务端代码分离,他们为同一个jar 文件,所以我们直接引入zookeeper的maven即可, 这里版本请保持与服务端版本一致,不然会有很多兼容性的问题 为了便于测试,直接在初始化方法中创建zookeeper实例 创建Zookeeper实例的方法:

    2024年02月07日
    浏览(38)
  • 使用 @GrpcClient 实现客户端

    转载请注明出处: @GrpcClient 注解的作用是将 gRPC 客户端注入到 Spring 容器中,方便在应用程序中使用 gRPC 客户端调用 gRPC 服务提供的函数。使用 @GrpcClient 注解,我们可以像使用其他 Spring Bean 一样来使用 gRPC 客户端,无需手动创建连接通道和 stub 类对象,Spring Boot 会自动为我

    2024年02月05日
    浏览(30)
  • Trojan客户端使用教程

    此教程使用的是 Centos7 x86_64系统 使用此命令下载Trojan客户端 官方版本(GitHub): cd /usr/src wget https://github.com/trojan-gfw/trojan/releases/download/v1.15.1/trojan-1.15.1-linux-amd64.tar.xz 解压Trojan文件 tar xvf trojan-1.15.1-linux-amd64.tar.xz 打开配置文件 cd /usr/src/trojan vi config.json 按i进入编辑模式 run_typ

    2024年02月02日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包