public void Generate_Test() { var generator = new ServicerProxyGenerator("Test", new List <Type>() { typeof(TestData) }); var testDataClassDescripter = generator.Generate().FirstOrDefault(); Assert.NotNull(testDataClassDescripter); var notGrpcTaskGenericMethod = testDataClassDescripter.Methods.FirstOrDefault(p => p.Name == "NotGrpcTaskGenericMethod"); Assert.NotNull(notGrpcTaskGenericMethod); Assert.Equal(notGrpcTaskGenericMethod.ReturnTypeStr, "System.Threading.Tasks.Task<Kadder.Test.Grpc.Client.ServicerProxyGeneratorTest>"); Assert.Equal(notGrpcTaskGenericMethod.Parameters.Count, 3); var taskGenericMethod = testDataClassDescripter.Methods.FirstOrDefault(p => p.Name == "TaskGenericMethod"); Assert.NotNull(taskGenericMethod); Assert.Equal(taskGenericMethod.ReturnTypeStr, "Task<ServicerProxyGeneratorTest>"); Assert.Equal(taskGenericMethod.Parameters.Count, 1); var tupleNotGrpcMethod = testDataClassDescripter.Methods.FirstOrDefault(p => p.Name == "TupleNotGrpcMethod"); Assert.NotNull(tupleNotGrpcMethod); Assert.Equal(tupleNotGrpcMethod.ReturnTypeStr, "System.ValueTuple<int,string,Kadder.Test.Grpc.Client.ServicerProxyGeneratorTest>"); Assert.Equal(tupleNotGrpcMethod.Parameters.Count, 3); }
public static IHostBuilder UseGrpcServer(this IHostBuilder hostBuilder, Action <HostBuilderContext, IServiceCollection, GrpcServerBuilder> builderAction = null, string configurationKeyName = "GrpcServer") { hostBuilder.ConfigureServices((context, services) => { var log = services.BuildServiceProvider().GetService <ILogger <GrpcServerBuilder> >(); var builder = context.Configuration.GetSection(configurationKeyName).Get <GrpcServerBuilder>() ?? new GrpcServerBuilder(); builderAction?.Invoke(context, services, builder); var server = new Server(builder.Options.ChannelOptions); foreach (var port in builder.Options.Ports) { server.Ports.Add(new ServerPort(port.Host, port.Port, port.Credentials)); } foreach (var interceptor in builder.Interceptors) { services.AddSingleton(interceptor); } foreach (var assemblyName in builder.AssemblyNames) { builder.Assemblies.Add(Assembly.Load(assemblyName)); } builder.Assemblies.Add(Assembly.GetEntryAssembly()); if (log.IsEnabled(LogLevel.Debug)) { log.LogDebug(builder.ToString()); } var servicerTypes = ServicerHelper.GetServicerTypes(builder.Assemblies); if (servicerTypes == null || servicerTypes.Count == 0) { throw new ArgumentNullException("Not found any grpc servicer!"); } var servicerProxyers = new ServicerProxyGenerator(builder.Options.PackageName, servicerTypes).Generate(); var codeBuilder = new CodeBuilder("Kadder.Grpc.Server"); codeBuilder.CreateClass(servicerProxyers.ToArray()); codeBuilder.AddAssemblyRefence(Assembly.GetExecutingAssembly()) .AddAssemblyRefence(typeof(ILogger).Assembly) .AddAssemblyRefence(typeof(ServerServiceDefinition).Assembly) .AddAssemblyRefence(typeof(ServiceProviderServiceExtensions).Assembly) .AddAssemblyRefence(typeof(Console).Assembly) .AddAssemblyRefence(servicerTypes.Select(p => p.Assembly).Distinct().ToArray()) .AddAssemblyRefence(typeof(KadderBuilder).Assembly) .AddAssemblyRefence(typeof(GrpcServerOptions).Assembly) .AddAssemblyRefence(builder.GetType().Assembly); var codeAssembly = codeBuilder.BuildAsync().Result; foreach (var servicerProxyer in servicerProxyers) { var namespaces = $"{servicerProxyer.Namespace}.{servicerProxyer.Name}"; var proxyerType = codeAssembly.Assembly.GetType(namespaces); services.AddSingleton(proxyerType); builder.GrpcServicerProxyers.Add(proxyerType); } services.AddSingleton(server); services.AddSingleton(builder); services.AddSingleton <IBinarySerializer, ProtobufBinarySerializer>(); services.AddSingleton(typeof(KadderBuilder), builder); services.AddSingleton <IObjectProvider, ObjectProvider>(); }); return(hostBuilder); }