日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2024/8/23 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();

啟動項目試一試效果:

示例代碼: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技能?

好文章,我在看??

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的assembly 输出ab中所有数_.NET Core中批量注入Grpc服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。