Skip to content

Commit 78758b9

Browse files
committed
standardize some handling of name parts (don't always use Namespace from contract type)
1 parent 008225c commit 78758b9

File tree

4 files changed

+49
-26
lines changed

4 files changed

+49
-26
lines changed

src/protobuf-net.Grpc.AspNetCore/ServicesExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public static IGrpcServerBuilder AddCodeFirstGrpc(this IServiceCollection servic
2626
{
2727
var builder = configureOptions == null ? services.AddGrpc() : services.AddGrpc(configureOptions);
2828
services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IServiceMethodProvider<>), typeof(CodeFirstServiceMethodProvider<>)));
29+
services.TryAddSingleton(SimpleRpcExceptionsInterceptor.Instance);
2930
return builder;
3031
}
3132

src/protobuf-net.Grpc.Reflection/FileDescriptorSetFactory.cs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Collections.Generic;
1010
using System.IO;
1111
using System.Linq;
12+
using System.Runtime.InteropServices;
1213

1314
namespace ProtoBuf.Grpc.Reflection
1415
{
@@ -40,34 +41,38 @@ private static void Populate(FileDescriptorSet fileDescriptorSet, Type serviceTy
4041

4142
var serviceDescriptor = new ServiceDescriptorProto
4243
{
43-
Name = serviceName!.Split('.').Last()
44+
Name = ServiceBinder.GetNameParts(serviceName, serviceType, out var package),
4445
};
4546

4647
var dependencies = new HashSet<string>();
4748
foreach (var op in ContractOperation.FindOperations(binderConfiguration, serviceContract, null))
4849
{
4950
// TODO: Validate op
50-
serviceDescriptor.Methods.Add(new MethodDescriptorProto
51+
if (TryGetType(binderConfiguration, op.From, fileDescriptorSet, out var inputType, out var inputFile)
52+
&& TryGetType(binderConfiguration, op.From, fileDescriptorSet, out var outputType, out var outputFile))
5153
{
52-
Name = op.Name,
53-
InputType = GetType(binderConfiguration, op.From, fileDescriptorSet, out string? inputFile),
54-
OutputType = GetType(binderConfiguration, op.To, fileDescriptorSet, out string? outputFile),
55-
ClientStreaming = op.MethodType == MethodType.ClientStreaming ||
56-
op.MethodType == MethodType.DuplexStreaming,
57-
ServerStreaming = op.MethodType == MethodType.ServerStreaming ||
58-
op.MethodType == MethodType.DuplexStreaming
59-
});
60-
61-
dependencies.Add(inputFile);
62-
dependencies.Add(outputFile);
54+
serviceDescriptor.Methods.Add(new MethodDescriptorProto
55+
{
56+
Name = op.Name,
57+
InputType = inputType,
58+
OutputType = outputType,
59+
ClientStreaming = op.MethodType == MethodType.ClientStreaming ||
60+
op.MethodType == MethodType.DuplexStreaming,
61+
ServerStreaming = op.MethodType == MethodType.ServerStreaming ||
62+
op.MethodType == MethodType.DuplexStreaming
63+
});
64+
65+
dependencies.Add(inputFile);
66+
dependencies.Add(outputFile);
67+
}
6368
}
6469

6570
var fileDescriptor = new FileDescriptorProto
6671
{
6772
Name = serviceName + ".proto",
6873
Services = { serviceDescriptor },
6974
Syntax = "proto3",
70-
Package = serviceContract.Namespace
75+
Package = package
7176
};
7277

7378
foreach (var dependency in dependencies)
@@ -80,7 +85,7 @@ private static void Populate(FileDescriptorSet fileDescriptorSet, Type serviceTy
8085
}
8186
}
8287

83-
private static string GetType(BinderConfiguration binderConfiguration, Type type, FileDescriptorSet fileDescriptorSet, out string descriptorProto)
88+
private static bool TryGetType(BinderConfiguration binderConfiguration, Type type, FileDescriptorSet fileDescriptorSet, out string fullyQualifiedName, out string descriptorProto)
8489
{
8590
var typeName = type.Name;
8691
var fileName = type.FullName + ".proto";
@@ -95,13 +100,23 @@ private static string GetType(BinderConfiguration binderConfiguration, Type type
95100
using var reader = new StringReader(schema);
96101

97102
fileDescriptorSet.Add(fileName, includeInOutput: true, reader);
98-
fileDescriptor = fileDescriptorSet.Files.Single(f => f.Name.Equals(fileName, StringComparison.Ordinal));
103+
fileDescriptor = fileDescriptorSet.Files.SingleOrDefault(f => f.Name.Equals(fileName, StringComparison.Ordinal));
104+
if (fileDescriptor is null)
105+
{
106+
fullyQualifiedName = descriptorProto = "";
107+
return false;
108+
}
99109
}
100110

111+
var msgType = fileDescriptor.MessageTypes.SingleOrDefault(m => m.Name.Equals(typeName, StringComparison.OrdinalIgnoreCase));
112+
if (msgType is null)
113+
{
114+
fullyQualifiedName = descriptorProto = "";
115+
return false;
116+
}
101117
descriptorProto = fileDescriptor.Name;
102-
103-
return "." + fileDescriptor.Package + "." + fileDescriptor.MessageTypes
104-
.Single(m => m.Name.Equals(typeName, StringComparison.OrdinalIgnoreCase)).Name;
118+
fullyQualifiedName = "." + fileDescriptor.Package + "." + msgType.Name;
119+
return true;
105120
}
106121
}
107122
}

src/protobuf-net.Grpc.Reflection/SchemaGenerator.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,7 @@ public string GetSchema(Type contractType)
4242
throw new ArgumentException($"Type '{contractType.Name}' is not a service contract", nameof(contractType));
4343
}
4444

45-
string package = "";
46-
var idx = name!.LastIndexOf('.');
47-
if (idx >= 0)
48-
{
49-
package = name.Substring(0, idx);
50-
name = name.Substring(idx + 1);
51-
}
45+
name = ServiceBinder.GetNameParts(name, contractType, out var package);
5246
var service = new Service
5347
{
5448
Name = name

src/protobuf-net.Grpc/Configuration/ServiceBinder.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ protected virtual string GetDefaultName(MethodInfo method)
6969
return opName ?? "";
7070
}
7171

72+
internal static string GetNameParts(string? declaredName, Type? type, out string package)
73+
{
74+
declaredName ??= "";
75+
var idx = declaredName.LastIndexOf('.');
76+
if (idx >= 0)
77+
{
78+
package = declaredName.Substring(0, idx);
79+
return declaredName.Substring(idx + 1);
80+
}
81+
package = type?.Namespace ?? "";
82+
return declaredName;
83+
}
84+
7285
/// <summary>
7386
/// Indicates whether an interface should be considered a service-contract (and if so: by what name)
7487
/// </summary>

0 commit comments

Comments
 (0)