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;
}
}
}