响应式网站开发现状如何只做网站
web/
2025/9/30 21:35:44/
文章来源:
响应式网站开发现状,如何只做网站,网站建设电话销售话术实例,优而思 网站(给DotNet加星标#xff0c;提升.Net技能)转自#xff1a;张子浩cnblogs.com/ZaraNet/p/12167517.htmlGRPC 是谷歌发布的一个开源、高性能、通用RPC服务#xff0c;尽管大部分 RPC 框架都使用 TCP 协议#xff0c;但其实 UDP 也可以#xff0c;而 gRPC 干脆就用了 HTTP2。… (给DotNet加星标提升.Net技能)转自张子浩cnblogs.com/ZaraNet/p/12167517.htmlGRPC 是谷歌发布的一个开源、高性能、通用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 Dictionarystring,string GetGrpcServices(string assemblyName){if (!string.IsNullOrEmpty(assemblyName)) { Assembly assembly Assembly.Load(assemblyName); List ts assembly.GetTypes().ToList();var result new Dictionarystring, string();foreach (var item in ts.Where(uu.Namespace Grpc.Server.Services)) { result.Add(item.Name,item.Namespace); }return result; }return new Dictionarystring, string(); }}这样子我们就注入了所有命名空间为Grpc.Server.Services的服务但这样好像无法达到某些控制我们应当如何处理呢我建议携程Attribute的形式创建一个Flag.public class GrpcServiceAttribute : Attribute{public bool IsStart { get; set; }}将要在注入的服务商添加该标识例如这样。[GrpcService]public class GreeterService : Greeter.GreeterBase{...}随后根据反射出来的值找到 AttributeType 的名称进行判断即可。public static Dictionarystring,string GetGrpcServices(string assemblyName){if (!string.IsNullOrEmpty(assemblyName)) { Assembly assembly Assembly.Load(assemblyName); List ts assembly.GetTypes().ToList();var result new Dictionarystring, string();foreach (var item in ts.Where(uu.CustomAttributes.Any(aa.AttributeType.Name GrpcServiceAttribute))) { result.Add(item.Name,item.Namespace); }return result; }return new Dictionarystring, string();}随后我们的批量注入在Starup.cs中添加一行代码即可。app.useMyGrpcServices();启动项目试一试效果示例代码:https://github.com/zaranetCore/My_Blog-s-Sample/tree/master/gRPC_DI/grpc_blazor_sample推荐阅读 点击标题可跳转.NET 5 Preview 1 发布ASP.NET Core基于Consul动态配置热更新.NET CoreVue后台管理基础框架前端授权看完本文有收获请转发分享给更多人关注「DotNet」加星标提升.Net技能 好文章我在看❤️
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84666.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!