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