using Grpc.Core; using TEAMModelOS.SDK.Module.GrpcServer.Implements; using TEAMModelOS.SDK.Module.GrpcServer.Interfaces; using TEAMModelOS.SDK.Module.GrpcServer.Internal; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; namespace TEAMModelOS.SDK.Module.GrpcServer.Extensions { /// /// Grpc 配置相关的扩展方法 /// public static class GrpcServerConfigurationExtensions { public static GrpcServerServiceBuilder Builder { get; set; } /// /// /// /// /// private static GrpcServerServiceBuilder AddServerBuilder(this IServiceCollection services) { return new GrpcServerServiceBuilder(services); } /// /// 注册 Grpc 服务 /// /// 配置模块 /// 配置操作 public static GrpcServerServiceBuilder AddGrpcServer(this IServiceCollection services) { if (Builder == null) { Builder = services.AddServerBuilder(); } //自动扫描基于 IGrpcService 的Grpc服务 //services.Scan(scan => scan.FromAssemblyOf() // .AddClasses().AsImplementedInterfaces().WithSingletonLifetime()); //引入当前 services.Scan(scan => scan.FromApplicationDependencies() .AddClasses(classes => classes.AssignableTo()) .AsImplementedInterfaces() .WithSingletonLifetime()); //services.Scan(scan => scan.FromApplicationDependencies() // .AddClasses().AsImplementedInterfaces().WithSingletonLifetime()); services.AddSingleton(); return Builder; } /// /// Grpc配置信息 /// /// /// /// public static GrpcServerServiceBuilder AddGrpcConfiguration(this GrpcServerServiceBuilder builder, GrpcServerConfig[] serverConfigs) { builder.Services.AddSingleton(serverConfigs); return builder; } /// /// Grpc 服务端IP 配置 /// /// /// /// public static GrpcServerServiceBuilder AddGrpcIpConfig(this GrpcServerServiceBuilder builder,GrpcIPConfig config) { builder.Services.AddSingleton(config); return builder; } /// /// 注入基本配制 /// /// /// public static GrpcServerServiceBuilder UseOptions(this GrpcServerServiceBuilder builder, Action action) { action(GrpcExtensionsOptions.Instance); return builder; } /// /// CodeFirst生成proto文件 /// /// /// public static GrpcServerServiceBuilder UseProtoGenerate(this GrpcServerServiceBuilder builder, string dir) { ProtoGenerator.Gen(dir); return builder; } /// /// 注入GrpcService /// /// /// public static GrpcServerServiceBuilder UseGrpcService(this GrpcServerServiceBuilder builder, IEnumerable grpcServices) { var builders = ServerServiceDefinition.CreateBuilder(); grpcServices.ToList().ForEach(grpc => grpc.RegisterMethod(builders)); // _serviceDefinitions.Add(builders.Build()); return builder; } } }