assembly 输出ab中所有数_.NET Core中批量注入Grpc服务

(给DotNet加星标,提升.Net技能)

转自:张子浩cnblogs.com/ZaraNet/p/12167517.html

GRPC 是谷歌发布的一个开源、高性能、通用RPC服务,尽管大部分 RPC 框架都使用 TCP 协议,但其实 UDP 也可以,而 gRPC 干脆就用了 HTTP2。还有就是它具有跨平台、跨语言 等特性,这里就不再说明RPC是啥。

在写项目当中,grp服务过多会非常头疼,那么我们分析一下如果解决这个问题。我们都知道在grpc注入到.NET Core 中使用的方法是 MapGrpcService 方法,是一个泛型方法。

[NullableAttribute(0)]
[NullableContextAttribute(1)]
public static class GrpcEndpointRouteBuilderExtensions
{
public static GrpcServiceEndpointConventionBuilder MapGrpcService(this IEndpointRouteBuilder builder) where TService : class;
}

那我们就可以通过反射调用这个方法来进行服务批量注册,看方法的样子我们只需要将我们的服务对应 TService 以及将我们的 endpointBuilder 传入即可,我们看下源码是不是就像我所说的那样?

public static class GrpcEndpointRouteBuilderExtensions
{
public static GrpcServiceEndpointConventionBuilder MapGrpcService(this IEndpointRouteBuilder builder) where TService : class
{if (builder == null)
{throw new ArgumentNullException(nameof(builder));
}
ValidateServicesRegistered(builder.ServiceProvider);var serviceRouteBuilder = builder.ServiceProvider.GetRequiredService>();var endpointConventionBuilders = serviceRouteBuilder.Build(builder);return new GrpcServiceEndpointConventionBuilder(endpointConventionBuilders);
}private static void ValidateServicesRegistered(IServiceProvider serviceProvider){var marker = serviceProvider.GetService(typeof(GrpcMarkerService));if (marker == null)
{throw new InvalidOperationException("Unable to find the required services. Please add all the required services by calling " +"'IServiceCollection.AddGrpc' inside the call to 'ConfigureServices(...)' in the application startup code.");
}
}
}

ok,看样子没什么问题就像我刚才所说的那样做。现在我们准备一个proto以及一个Service.这个就在网上找个吧..首先定义一个proto,它是grpc中的协议,也就是每个消费者遵循的。

syntax = "proto3";option csharp_namespace = 

随后定义Service,当然非常简单, Greeter.GreeterBase 是重新生成项目根据proto来生成的。

public class GreeterService : Greeter.GreeterBase
{
public override Task SayHello(HelloRequest request, ServerCallContext context)
{
var greeting = string.Empty;switch (request.LaguageEnum)
{case HelloRequest.Types.Laguage.EnUs:
greeting = "Hello";break;case HelloRequest.Types.Laguage.ZhCn:
greeting = "你好";break;
}return Task.FromResult(new HelloReply
{
Message = $"{greeting} {request.Name}",
Num = new Random().Next()
});
}
}

此时我们需要自定义一个中间件,来批量注入grpc服务,其中我们获取了类型为 GrpcEndpointRouteBuilderExtensions ,并获取了它的方法,随后传入了他的TService,最后通过Invoke转入了我们的终点对象。

public static class GrpcServiceExtension
{
public static void Add_Grpc_Services(IEndpointRouteBuilder builder){
Assembly assembly = Assembly.GetExecutingAssembly();
foreach (var item in ServicesHelper.GetGrpcServices("Grpc.Server"))
{
Type mytype = assembly.GetType(item.Value + "."+item.Key);
var method = typeof(GrpcEndpointRouteBuilderExtensions).GetMethod("MapGrpcService").MakeGenericMethod(mytype);
method.Invoke(null, new[] { builder });
};
}
public static void useMyGrpcServices(this IApplicationBuilder app){
app.UseEndpoints(endpoints =>
{
Add_Grpc_Services(endpoints);
});
}
}

在 ServicesHelper 中通过反射找到程序集当中的所有文件然后判断并返回。

public static class ServicesHelper
{
public static Dictionary<string,string> GetGrpcServices(string assemblyName){
if (!string.IsNullOrEmpty(assemblyName))
{
Assembly assembly = Assembly.Load(assemblyName);
List ts = assembly.GetTypes().ToList();var result = new Dictionary<string, string>();foreach (var item in ts.Where(u=>u.Namespace == "Grpc.Server.Services"))
{
result.Add(item.Name,item.Namespace);
}return result;
}return new Dictionary<string, string>();
}
}

这样子我们就注入了所有命名空间为Grpc.Server.Services的服务,但这样好像无法达到某些控制,我们应当如何处理呢,我建议携程Attribute的形式,创建一个Flag.

public class GrpcServiceAttribute : Attribute
{
public bool IsStart { get; set; }
}

将要在注入的服务商添加该标识,例如这样。

[GrpcService]
public class GreeterService : Greeter.GreeterBase
{...}

随后根据反射出来的值找到 AttributeType 的名称进行判断即可。

public static Dictionary<string,string> GetGrpcServices(string assemblyName){
if (!string.IsNullOrEmpty(assemblyName))
{
Assembly assembly = Assembly.Load(assemblyName);
List ts = assembly.GetTypes().ToList();var result = new Dictionary<string, string>();foreach (var item in ts.Where(u=>u.CustomAttributes.Any(a=>a.AttributeType.Name == "GrpcServiceAttribute")))
{
result.Add(item.Name,item.Namespace);
}return result;
}return new Dictionary<string, string>();
}

随后我们的批量注入在Starup.cs中添加一行代码即可。

app.useMyGrpcServices();

启动项目试一试效果:

cbd0c768a2b13cb12e60cb5cae5e8467.png

示例代码:https://github.com/zaranetCore/My_Blog-s-Sample/tree/master/gRPC_DI/grpc_blazor_sample

推荐阅读  点击标题可跳转

.NET 5 Preview 1 发布

ASP.NET Core基于Consul动态配置热更新.NET Core+Vue后台管理基础框架前端授权

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

082c8edb728ca9bc01830e6a18f1cde9.png

好文章,我在看❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kdj指标主要看哪个值_悟空CRM:在线crm主要看这两个指标,都非常重要!

crm对很多企业都非常重要&#xff0c;可是很多人并不明白crm到底重要在哪些地方&#xff1f;比如说很多人都比较喜欢使用这个系统&#xff0c;尤其是在线crm。 在线crm主要看这两个指标&#xff0c;都非常重要&#xff0c;这两个指标如果上去了&#xff0c;基本上对企业的运营都…

鼠标控制视角wasd移动_绝地求生:为什么控制方向键是WASD?网友:就不能是其他键位吗?...

哈喽&#xff0c;大家好这里是大能有话说&#xff0c;现在的网络游戏越来越发达&#xff0c;每个游戏的玩法有非常多种&#xff0c;但是不知道小伙伴们有没有发现&#xff0c;在需要控制方向的情况下&#xff0c;咱们用的都是W、A、S、D这四个键&#xff0c;那为什么偏偏就一定…

javawed商店商品结算_微信小商店搭建

点击上方蓝字关注我吧个人也能搭建微信小商店了&#xff0c;直接下单&#xff0c;微信立马到账&#xff0c;方便快捷&#xff0c;对于个人来说&#xff0c;在网上卖东西&#xff0c;有了一个利于客户下单的渠道。1、微信小商店介绍为了进一步降低进入小程序生态经营和卖货的门槛…

图片还原去遮挡_斗罗:这届coser太强,动画刚播出两天,战损三哥就被还原了...

斗罗大陆作为玄机旗下的热门动画&#xff0c;不仅多次登上热搜&#xff0c;引发漫迷热议&#xff0c;还吸引了众位coser的注意力。作品从开播到现在&#xff0c;基本上绝大多数角色都曾被coser还原过。对于里面的热门角色&#xff0c;例如史莱克七怪&#xff0c;几乎是每更换一…

熟悉html css,编写HTML和CSS的前端开发中不一定熟悉JavaScript

原标题&#xff1a;编写HTML和CSS的前端开发中不一定熟悉JavaScript作为前端开发人员&#xff0c;HTML、css、Java是必备的知识技能&#xff0c;但是现实工作工作中并非所有的前端都知道Java&#xff0c;根据外国一个网站的匿名调查发现&#xff0c;有17%的开发人员不知道Java&…

fastapi 传输文件存文件_揭秘|国内影视文件传输的真相,跨境文件传输更不简单...

2020年影视行业至黑时刻总算要过去了&#xff0c;下半年复苏迹象已经显现。作为影视行业的基础搬运工&#xff0c;文件传输贯穿始末。无论是TB级原始素材还是后期协作的大文件&#xff0c;多团队高效协作必然要考虑大文件传输这个基础工具。在选择文件传输软件这件事上&#xf…

计算机考csp200分啥水平,计算机与信息工程学院成功举办第20次CCF CSP认证考试

2020年9月13日&#xff0c;计算机与信息工程学院在计算机大楼201举办第二十次CCF CSP认证考试。这是计算机与信息工程学院2019年12月与中国计算机学会签署协议、河南大学正式成为CSP认证考点以来&#xff0c;举办的首次CCF CSP认证考试。本次认证考试历时四个小时&#xff0c;共…

gta5显示nat较为严格_为何严格治理下雾霾天仍频发?哈尔滨市环保局解答重污染天3大疑问...

哈尔滨市环保局副局长姚玮晶解答近期重污染天三疑问我省与吉林大气污染或将联防联控气象条件不利秸秆焚烧集中 是雾霾主因今年供暖季以来&#xff0c;冰城污染天频发&#xff0c;与去年同期相比&#xff0c;重污染天气有所增多。自2013年冰城爆发大规模雾霾以来&#xff0c;省市…

中国科技大学计算机考研复试内容,中国科学技术大学考研复试

出国留学网考研网为大家提供中国科学技术大学材料科学与工程学院2018考研复试内容&#xff0c;更多考研资讯请关注我们网站的更新!中国科学技术大学材料科学与工程学院2018考研复试内容为进一步规范硕士生复试工作&#xff0c;确保复试工作的有效性和公平、公开、公正原则&…

单片机搭建环境烧录方法_单片机仿真器的工作原理解析

仿真器出现的原因1、早期的单片机内部没有ROM&#xff0c;比如8031、8032&#xff0c;这种单片机只能外部扩展紫外擦除的EPROM存储器&#xff0c;就是芯片上带窗口的ROM。紫外擦除的ROM需要用紫外灯照射较长时间(10分钟或者更多)才能擦掉芯片中的内容以便写入新的程序。2、有的…

分布式存储图解_BERT的youxiu变体:ALBERT论文图解介绍

作者&#xff1a;amitness编译&#xff1a;ronghuaiyang正文共&#xff1a; 3116 字 21 图预计阅读时间&#xff1a; 9 分钟原文链接&#xff1a;BERT的youxiu变体&#xff1a;ALBERT论文图解介绍​mp.weixin.qq.comALBERT作为BERT的一个变体&#xff0c;在保持性能的基础上&am…

数据分析转软件测试,(转)性能测试用户模型(三):基础数据分析、场景数据...

作者&#xff1a;薛定谔的破猫基础数据分析以下图表均取自互联网&#xff0c;本文是在“已经获取所需数据”的前提下&#xff0c;讲解性能测试的一些设计思路。至于如何才能取得这些数据&#xff0c;将在后续的文章中说明。系统访问量分布由系统的日访问量分布图&#xff0c;可…

王者体验服服务器注册人数已满,王者官方大厅奖励有多难获得?服务器直接崩溃,玩家:别发红包了...

可乐要加冰&#xff0c;乔妹在你心&#xff0c;大家好我是小乔妹&#xff0c;每天为您分享有趣的王者资讯&#xff0c;感谢您的关注。王者荣耀一直以来都有许许多多的活动&#xff0c;有限时活动也有长久活动&#xff0c;但官方专属大厅奖励活动确实王者史上第一次奖励&#xf…

cmd输入pip报错_使用Pip管理Python的包

这是我的Python教程的第2篇文章第1篇文章在这里:Python安装0x01Pip介绍Pip是Python的包管理程序,负责Python的包的查找,下载,安装,卸载工作;使用Pip可以轻松的管理Python成千上万的第三包,使你在Python程序的开发如鱼得水0x02使用Pip确保已经把Python的路径添加进系统路径右键我…

jenkins部署流程图_一文教你使用 Jenkins 设计多环境、多项目持续集成环境!

自动化部署主要是为了解决项目多、环境多、持续集成慢、部署操作麻烦、手动操作易出错、自动化运维等问题。Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插件来支持构建、部署、自动化&#xff0c; 满足任何项目的需要。目标&#xff1a;支持多分支、多环境、…

udp 使用connect优点_一文搞懂TCP和UDP的区别

TCP(Transmission Control Protocol&#xff0c;传输控制协议)和UDP(User Data Protocol ,用户数据报协议)都属于TCP/IP协议簇。TCP/IP协议集包括了超文本传输协议(HTTP)、文本传输协议(FTP)、远程登录协议(Telnet)、internet协议(IP)、internet控制信息协议(IMCP)等&#xff0…

小森生活显示无可用服务器,《小森生活》无可用游戏服务器解决教程 无可用网关服务器怎么办...

导读小森生活无可用网关服务器是什么意思&#xff1f;怎么解决&#xff1f;小森生活无可用网关服务器这个提示在进入游戏中会出现哦&#xff0c;很多玩家都无法正常进入游戏怎么解决呢&#xff0c;现在就来告诉给大家详细解决方法吧~小森生活无可用游戏服务器...小森生活无可用…

矢量归一化_浅析矢量网络分析仪误差模型及校准

最近跟业界一位同仁讨论了矢量网络分析仪的误差模型及校准过程&#xff0c;简单整理了一下&#xff0c;分享给大家&#xff0c;欢迎一起讨论。矢网的误差模型确实不太好理解&#xff0c;一般只有研发矢网或者专攻测试技术的人员才会深入探究。使用矢网测试之前&#xff0c;都是…

数据库表名大小写_某教程学习笔记(一):09、MYSQL数据库漏洞

她其实并不喜欢你&#xff0c;只是在寂寞的时候&#xff0c;你刚好撞上去&#xff0c;刚好你对她好&#xff0c;刚好你能入她眼&#xff0c;刚好她来着不拒&#xff0c;这所有都是刚好。。。---- 网易云热评一、MYSQL语句创建数据库create database test;选择要操作的数据库use…

arcgis几何修复有作用吗_修复损坏的 shapefile

一、SHP文件Shapefile文件(简称SHP)作为ESRI一种经典的数据格式&#xff0c;被很多其他软件所支持&#xff0c;如CAD、MapGIS等&#xff0c;虽然也有一些限制(如无法进行拓扑分析、字段长度为10个字符等)&#xff0c;但其仍然是广泛使用的空间数据格式。用得多了&#xff0c;有…