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);
        }
Esempio n. 2
0
        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);
        }