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,一经查实,立即删除!

相关文章

福建高职计算机知识点,2013福建高职单招 计算机类专业 知识试题

2013福建高职单招 计算机类专业 知识试题计算机类专业基础知识试题第Ⅰ卷一、单项选择题(在每小题的四个备选答案中&#xff0c;选出一个正确答案&#xff0c;并将正确的字母标号填涂在答题卡相应在位置上&#xff0c;每小题3分&#xff0c;共120分)1、 世界上第一台计算机(ENI…

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

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

在html中 正确的嵌套方式是( ).,HTML及网页制作练习题-完整版

1、在HTML中&#xff0c;()标记不可出现在和标记符之间。(C)(&#xff21;)(&#xff22;)(&#xff23;)(&#xff24;)2、(A)单元格所跨的列数(B)行的宽度(C)列的高度(D)单元格所跨的行数3、在HTML中&#xff0c;正确的嵌套方式是(B)。(&#xff21;)(&#xff22;)(&#xf…

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

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

19秋学期计算机网络基础在线作业,南开19秋学期(1709、1803、1809、1903、1909)《计算机网络基础》在线作业资料答案3...

19秋学期(1709、1803、1809、1903、1909)《计算机网络基础》在线作业-0003试卷总分:100 得分:100一、单选题 (共 15 道试题,共 30 分)1.物理层的主要任务描述为确定与传输媒体的接口的一些特性&#xff0c;()指明对于不同功能的各种可能事件的出现顺序。[A.]过程特性[B.]电气特…

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

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

计算机网络设置中如何删除家庭组,【求助】Windows无法从该家庭组中删除你的计算机...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼echo 服务名称fdPHost&#xff0c;显示名称Function Discovery Provider Host&#xff0c;进程svchost.exeecho DEMAND或DISABLED或AUTO(手动、禁止、自动)sc config fdPHost start DEMANDecho stop立即停止start立即开启delete删除…

图片还原去遮挡_斗罗:这届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;共…

三菱goto怎么用_GOTO语句使用方法

课时&#xff1a;59节课时长&#xff1a;17.2小时课级&#xff1a;中级提高课程从FANUC和广数系统编程基础讲起&#xff0c;仅贴实际生产实践&#xff0c;适合职业院校教师、企业技术员、学生学习&#xff0c;讲解细致、全面&#xff0c;带你学习带你飞。基础入门篇主要介绍基本…

uva计算机水平,UVA 12096 集合栈计算机

UVA 12096 集合栈计算机题目描述有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈&#xff0c;并且支持以下操作。PUSH&#xff1a;空集“{}”入栈。DUP&#xff1a;把当前栈顶元素复制一份后再入栈。UNION&#xff1a;出栈两个集合&#xff0c;然后…

axis2 默认端口_使用axis2创建webservice

这个方式创建的webservice可以和web项目放到同一个工程下。创建webservice服务&#xff0c;所需要的jar包如下&#xff1a;axiom-api-1.2.8.jaraxiom-impl-1.2.8.jaraxis-0.1.jaraxis2-adb-1.5.jaraxis2-kernel-1.5.jaraxis2-transport-http-1.5.jaraxis2-transport-local-1.5.…

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

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

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

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

react滑动切换tab动画效果_使用React实现的水平标签(Tab)栏

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定var data [{name: Red, value: red},{name: Blue, value: blue},{name: Yellow, value: yellow},{name: Green, value: green},{name: White, value: White}];var TabSelector React.createClass({getInitialState…

计算机专业英语宋,机电一体化专业英语宋主民章.pdf

机电一体化专业英语宋主民章第 3 章 中间转换电路3.1 前言传感器在测量系统中是把所测的机械信号转换为电量的一次仪表。这些电量可能是所用元件的电阻、电容或电感参数的变化&#xff0c;需要用电桥将它们转换为电压或电流信号。另一方面&#xff0c;实际上由一次仪表产生的电…

iis直接访问公网ip_如何配置IIS让自己的网站在公网上被访问?

在大学里网页制作基本成了我们的必修课&#xff0c;只要简单的做个个人网站就可以了&#xff0c;有的朋友比较认真把自己的网站申请了域名发布上去了或者自己挂在自己电脑上让人家访问&#xff0c;不管只是学习上的要求还是工作上的要求我们简单的讲下网站通过iis设置来被公网访…

杭州电子科技大学计算机专硕表数二,杭州电子科技大学 计算机学院 2016级计算机技术(专硕)培养方案...

本专业领域学制为2.5年&#xff0c;其中课程学习时间一般为1年&#xff0c;参加专业实践、科研、撰写学位论文和论文答辩的时间为1.5年。四、培养方式与原则1、学习各环节的设置与安排及学分要求(1)课程学习时间为2学期。课程设置由学位课、非学位课和必修环节组成。学位课包括…