首页 > 其他分享 >根据继承接口批量注入GRPC客户端

根据继承接口批量注入GRPC客户端

时间:2022-11-15 16:37:01浏览次数:49  
标签:&& grpcService 批量 GRPC services typeof interfaceTypes var 客户端

        /// <summary>
        /// 作用域批量注入grpc数据 
        /// </summary>
        /// <typeparam name="IGrpcDependency">根据泛型获取需要注入的grpc接口</typeparam>
        /// <param name="services"></param>
        /// <returns></returns> 
        public static IServiceCollection AddGrpcScopedSerivce<IGrpcDependency>(this IServiceCollection services) where IGrpcDependency : class
        {
            var interfaceTypes = GetInterfaceTypes<IGrpcDependency>();

            foreach (var implementType in interfaceTypes)
            {
                var grpcService = GetGrpcService(implementType, services);
                services.AddScoped(implementType, g => grpcService);
            }

            return services;
        }
  /// <summary>
        /// 获取需要注入的接口
        /// </summary>
        /// <typeparam name="IGrpcDependency"></typeparam>
        /// <returns></returns>
        private static Type[] GetInterfaceTypes<IGrpcDependency>()
        {
            var baseType = typeof(IGrpcDependency);
            var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
            var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray();
            var types = referencedAssemblies
                .SelectMany(a => a.DefinedTypes)
                .Select(type => type.AsType())
                .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();

            var interfaceTypes = types.Where(x => x.IsInterface).ToArray();

            return interfaceTypes;
        }
   /// <summary>
        /// 获取grpc客户端服务
        /// </summary>
        /// <param name="t"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        private static object GetGrpcService(Type t, IServiceCollection services)
        {
            var channel = GetGrpcChannel(services);

            //由于是扩展方法,所以不能通过反射 GrpcChannel 调用,需要使用扩展类 GrpcClientFactory 调用
            var grpcClientFactory = typeof(GrpcClientFactory);

            //筛选指定方法
            var grpcService = grpcClientFactory.GetMethods().Where(m =>
                m.Name == "CreateGrpcService" &&
                m.GetParameters().Length > 1 &&
                m.GetParameters()[0].ParameterType == typeof(ChannelBase) &&
                m.GetParameters()[1].ParameterType == typeof(ClientFactory)

           ).FirstOrDefault();

            //MakeGenericMethod 将泛型传递给泛型方法<>,
            return grpcService.MakeGenericMethod(t).Invoke(null, new object[] { channel, null });
        }

 

标签:&&,grpcService,批量,GRPC,services,typeof,interfaceTypes,var,客户端
From: https://www.cnblogs.com/manga/p/16892852.html

相关文章

  • 使用 Spring Cloud LoadBalancer 实现客户端负载均衡
    使用SpringCloudLoadBalancer实现客户端负载均衡作者:Grey原文地址:博客园:使用SpringCloudLoadBalancer实现客户端负载均衡CSDN:使用SpringCloudLoadBalancer......
  • Containerd客户端工
    ctr是由containerd提供的一个客户端工具,crictl是CRI兼容的容器运行时命令接口,和containerd无关,由kubernetes提供,可以使用它来检查和调试k8s节点上的容器运行时和应用程序。......
  • 用友U8客户端打开余额表无响应
    用友U8客户端打开余额表无响应1、检查服务器,服务器上面无异常处理办法:检查客户端软件安装的根目录核对客户端的异常环境是否缺少文件:...\U8SOFT\Resources\enums\GL\en......
  • netmiko批量操作华为设备
    importnetmikoimportopenpyxlfromnetmikoimportConnectHandlerfromopenpyxlimportload_workbookfromconcurrent.futuresimportThreadPoolExecutor#从ex......
  • mongodb增删改查 及批量操作(二)
    1.增加insert插入多笔数据db.stu.insert([{_id:3,sn:'003',name:'zhangfei'},{_id:4,sn:'004',name:'guanyu'},{sn:'005',name:'liubei'}])增加复杂的文档db.stu.insert({na......
  • nuxt3批量引入svg文件
    nuxt3引入svg的方法和viet的差不多,只是细节上有些不同同样是两步,引入svg组件和引入svg文件第一步:引入svg组件在components文件夹下创建SvgIcon.vue组件<template>......
  • 批量转换MP3
    find.-name"*mp4"|grepmp4>.0001whilereadlinedoecho"$line"":copying-----"Vpath_name="$line"cp-rp"$line".done<.0001ls|grepm......
  • SqlBulkCopy(批量复制)方法,高性能批量插入数据
    https://blog.51cto.com/u_15162069/2751372https://blog.csdn.net/five_s/article/details/115213102SQLServer批量插入数据方案SqlBulkCopy相较于Insert语句而言......
  • chrome浏览器 开发者工具F12中某网站的sources下的源码如何批量保存
    1.常用保存Sources源码的两种方法1.1单个文件直接右键另存为1.2单个页面保存网页,就会把引用到的所有文件下载下来如果页面很多,文件也很多,静态资源也很多,那么得一......
  • 28、批量实现txt文件内容合并
    题目:  在many_org文件夹中有三个.txt文件,如何将三个文件的内容整理到一个文件里?思路:  1、遍历路径下的所有文件。  2、判断出.txt文件,将其所有内容保存至新列表......