private IReadOnlyList <RpcPublishedSingleton> GetPublishedSingletonsList(IServiceProvider?serviceProvider)
        {
            // TODO: This method is not particularily fast. Maybe add some caching? Or retrieve information from service stubs.
            var publishedSingletons = new List <RpcPublishedSingleton>();

            foreach (var type in this.server.ServiceActivator.GetPublishedSingletons())
            {
                var serviceInfo = RpcBuilderUtil.TryGetServiceInfoFromType(type);
                if (serviceInfo != null)
                {
                    IOptions <RpcServerOptions>?options = null;

                    if (serviceProvider != null)
                    {
                        options = (IOptions <RpcServerOptions>?)serviceProvider.GetService(
                            typeof(IOptions <>).MakeGenericType(
                                typeof(RpcServiceOptions <>).MakeGenericType(type)));
                    }

                    var registeredOptions = this.server.ServiceDefinitionsProvider.GetServiceOptions(type);
                    if (options?.Value?.AllowDiscovery ?? registeredOptions?.AllowDiscovery ?? true)
                    {
                        publishedSingletons.Add(new RpcPublishedSingleton
                        {
                            Name = serviceInfo.FullName
                        });
                    }
                }
            }

            return(publishedSingletons);
        }
Exemplo n.º 2
0
        private void WriteProto(Assembly assembly, TextWriter output)
        {
            var dynamicModuleBuilder = CreateModuleBuilder("RequestResponseTypes", "RequestResponseTypes.dll", false);

            StringBuilder serviceBuilder = new StringBuilder();

            RuntimeTypeModel typeModel = RuntimeTypeModel.Create();

            foreach (var exportedType in assembly.GetExportedTypes())
            {
                var serviceInfo = RpcBuilderUtil.TryGetServiceInfoFromType(exportedType);
                if (serviceInfo != null && serviceInfo.DefinitionSide != RpcServiceDefinitionSide.Client)
                {
                    serviceBuilder.AppendLine();
                    serviceBuilder.AppendLine($"service {serviceInfo.Name} {{");

                    foreach (var rpcMemberInfo in RpcBuilderUtil.EnumOperationHandlers(serviceInfo, true))
                    {
                        if (rpcMemberInfo is RpcOperationInfo rpcOpInfo)
                        {
                            var namedRequestType  = this.CreateRequestType(dynamicModuleBuilder, rpcOpInfo);
                            var namedResponseType = this.CreateResponseType(dynamicModuleBuilder, rpcOpInfo);
                            if (namedRequestType == null || namedResponseType == null)
                            {
                                continue;   // Should probably stop generator.
                            }

                            typeModel.Add(namedRequestType, true);
                            typeModel.Add(namedResponseType, true);

                            serviceBuilder.AppendLine(
                                $"\trpc {rpcOpInfo.Name} ({namedRequestType.Name}) returns ({namedResponseType.Name});");
                        }
                    }

                    serviceBuilder.AppendLine("}");
                }
            }

            string schema = typeModel.GetSchema(null, ProtoSyntax.Proto3);

            output.WriteLine(schema);
            output.WriteLine(serviceBuilder.ToString());
        }