コード例 #1
0
ファイル: GrpcServiceBuilder.cs プロジェクト: lanicon/Kadder
        /// <summary>
        /// Support version 0.0.6 before
        /// </summary>
        /// <param name="method"></param>
        /// <param name="parameter"></param>
        /// <param name="namespaceName"></param>
        /// <param name="codeBuilder"></param>
        /// <param name="bindServicesCode"></param>
        private void GenerateGrpcCallCodeForOldVersion(MethodInfo method, RpcParameterInfo parameter, string namespaceName,
                                                       string serviceName, CodeBuilder codeBuilder, ref StringBuilder bindServicesCode)
        {
            var serviceDefName = $"{namespaceName}.{serviceName}";
            var methodDefName  = method.Name.Replace("Async", "");
            var key            = $"{serviceDefName}.{methodDefName}";

            if (_oldVersionGrpcMethods.ContainsKey(key))
            {
                return;
            }
            bindServicesCode.AppendLine($@"
                .AddMethod(new Method<{parameter.ParameterType.Name}, {GrpcServiceBuilder.GetMethodReturn(method).Name}>(
                    MethodType.Unary,
                    ""{serviceDefName}"",
                    ""{methodDefName}"",
                    new Marshaller<{parameter.ParameterType.Name}>(
                        _binarySerializer.Serialize,
                        _binarySerializer.Deserialize<{parameter.ParameterType.Name}>
                    ),
                    new Marshaller<{GrpcServiceBuilder.GetMethodReturn(method).Name}>(
                        _binarySerializer.Serialize,
                        _binarySerializer.Deserialize<{GrpcServiceBuilder.GetMethodReturn(method).Name}>)
                    ),
                    {method.Name.Replace("Async", "")})");
            _oldVersionGrpcMethods.Add(key, key);
        }
コード例 #2
0
ファイル: GrpcServiceBuilder.cs プロジェクト: lanicon/Kadder
        private void GenerateProtoCode(MethodInfo method, RpcParameterInfo parameter, ref StringBuilder protoServiceCode, ref StringBuilder protoMessageCode)
        {
            var str = $"rpc {method.Name.Replace("Async", "")}({parameter.ParameterType.Name}) returns({GrpcServiceBuilder.GetMethodReturn(method).Name});";

            protoServiceCode.AppendLine();
            protoServiceCode.AppendLine(str);
            if (!_messages.Contains(parameter.ParameterType.Name))
            {
                protoMessageCode.AppendLine(GenerateProtoMessageCode(parameter.ParameterType));
                _messages.Add(parameter.ParameterType.Name);
            }
            if (_messages.Contains(GrpcServiceBuilder.GetMethodReturn(method).Name))
            {
                return;
            }
            protoMessageCode.AppendLine(GenerateProtoMessageCode(GrpcServiceBuilder.GetMethodReturn(method).ReturnType));
            _messages.Add(GrpcServiceBuilder.GetMethodReturn(method).Name);
        }
コード例 #3
0
ファイル: GrpcServiceBuilder.cs プロジェクト: lanicon/Kadder
        private ClassDescripter GenerateGrpcMethod(ClassDescripter @class, MethodInfo method, RpcParameterInfo parameter, Type[] baseInterfaces)
        {
            var className         = method.DeclaringType.Name;
            var messageName       = parameter.ParameterType.Name;
            var messageResultType = GrpcServiceBuilder.GetMethodReturn(method);
            var messageResultName = messageResultType.Name;
            var requestCode       = "messageEnvelope.Message";
            var responseCode      = "var result = ";
            var setResponseCode   = "result";

            if (parameter.IsEmpty)
            {
                requestCode = string.Empty;
            }
            if (messageResultType.IsEmpty)
            {
                responseCode    = string.Empty;
                setResponseCode = "new EmptyMessageResult()";
            }
            var code = $@"
            var envelope = new MessageEnvelope<{messageName}>();
            envelope.Message = request;  
            var grpcContext = new GrpcContext(envelope, context);
            Func<IMessageEnvelope, IServiceScope, Task<IMessageResultEnvelope>> handler = async (imsgEnvelope, scope) => 
            {{
                var messageEnvelope = (MessageEnvelope<{messageName}>) imsgEnvelope;
                {responseCode}await scope.ServiceProvider.GetService<{className}>().{method.Name}({requestCode});
                return new MessageResultEnvelope<{messageResultName}>() {{ MessageResult = {setResponseCode} }};
            }};
            var resultEnvelope = await _messageServicer.ProcessAsync(grpcContext, handler);
            return ((MessageResultEnvelope<{messageResultName}>)resultEnvelope).MessageResult;";

            return(@class.CreateMember(
                       new MethodDescripter(method.Name.Replace("Async", "") ?? "", true)
                       .SetAccess(AccessType.Public)
                       .AppendCode(code).SetReturn($"Task<{GrpcServiceBuilder.GetMethodReturn(method).Name}>")
                       .SetParams(
                           new ParameterDescripter(parameter.ParameterType.Name, "request"),
                           new ParameterDescripter("ServerCallContext", "context")))
                   .AddUsing($"using {parameter.ParameterType.Namespace};")
                   .AddUsing($"using {method.DeclaringType.Namespace};")
                   .AddUsing($"using {GrpcServiceBuilder.GetMethodReturn(method).Namespace};"));
        }
コード例 #4
0
ファイル: GrpcServiceBuilder.cs プロジェクト: lanicon/Kadder
        private void GenerateGrpcCallCode(MethodInfo method, RpcParameterInfo parameter, string namespaceName,
                                          CodeBuilder codeBuilder, ref StringBuilder bindServicesCode)
        {
            bindServicesCode.AppendLine($@"
                .AddMethod(new Method<{parameter.ParameterType.Name}, {GrpcServiceBuilder.GetMethodReturn(method).Name}>(
                    MethodType.Unary,
                    ""{namespaceName}.{method.DeclaringType.Name}"",
                    ""{method.Name.Replace("Async", "")}"",
                    new Marshaller<{parameter.ParameterType.Name}>(
                        _binarySerializer.Serialize,
                        _binarySerializer.Deserialize<{parameter.ParameterType.Name}>
                    ),
                    new Marshaller<{GrpcServiceBuilder.GetMethodReturn(method).Name}>(
                        _binarySerializer.Serialize,
                        _binarySerializer.Deserialize<{GrpcServiceBuilder.GetMethodReturn(method).Name}>)
                    ),
                    {method.Name.Replace("Async", "")})");

            codeBuilder
            .AddAssemblyRefence(parameter.ParameterType.Assembly)
            .AddAssemblyRefence(GrpcServiceBuilder.GetMethodReturn(method).Assembly);
        }