Skip to content

Adds MapGrpcService overload for ServerServiceDefinition#2586

Closed
aka-nse wants to merge 7 commits into
grpc:masterfrom
aka-nse:feature/MapGrpcService-with-ServerServiceDefinition
Closed

Adds MapGrpcService overload for ServerServiceDefinition#2586
aka-nse wants to merge 7 commits into
grpc:masterfrom
aka-nse:feature/MapGrpcService-with-ServerServiceDefinition

Conversation

@aka-nse

@aka-nse aka-nse commented Dec 16, 2024

Copy link
Copy Markdown
Contributor

This is a duplicate of #2535.
I made a serious operational error while tracking master, so I created a new pull request.
I apologize for the inconvenience.


Is your feature request related to a problem? Please describe.

This PR is implement for #2236.

ServerServiceDefinition is defined in Grpc.Core.Api library, and it was a prefer way to implement gRPC server with Grpc.Core.
In current grpc-dotnet, the server should be implemented on Asp.Net web application DI container via GrpcEndpointRouteBuilderExtensions.MapGrpcService generic method.
The APIs in this proposal bridges legacy way into grpc-dotnet to enable to migrate easier.

Describe the solution you'd like

2 overloads of GrpcEndpointRouteBuilderExtensions.MapGrpcService are added:

public static class GrpcEndpointRouteBuilderExtensions
{
    public static GrpcServiceEndpointConventionBuilder MapGrpcService(
        this IEndpointRouteBuilder builder,
        ServerServiceDefinition serviceDefinition);

    public static GrpcServiceEndpointConventionBuilder MapGrpcService(
        this IEndpointRouteBuilder builder,
        Func<IServiceProvider, ServerServiceDefinition> getServiceDefinition);
}

This change enables to map gRPC services via Grpc.Core.ServerServiceDefinition, therefore migration from Grpc.Core can be more easier.

Changes in this PR

  • Grpc.Core.Api

    • makes Grpc.Core.ServerServiceDefinition.BindService(ServiceBinderBase) method as public*
  • Grpc.AspNetCore.Server

    • adds new extension methods in Microsoft.AspNetCore.Builder.GrpcEndpointRouteBuilderExtensions class
      • MapGrpcService(this IEndpointRouteBuilder, ServerServiceDefinition)*
      • MapGrpcService(this IEndpointRouteBuilder, Func<IServiceProvider, ServerServiceDefinition>)*
    • appends service entries of ServerCallHandlerFactory and ServiceRouteBuilder (non-generic) on Microsoft.Extensions.DependencyInjection.AddServiceOptions method**
    • adds new class Grpc.AspNetCore.Server.Internal.EndpointServiceBinder to bind methods in ServerServiceDefinition into ASP.Net core web application server*
    • adds following internal classes that bind service via delegate instances instead of type argument:
      • Grpc.AspNetCore.Server.Internal.ServerCallHandlerFactory class*
      • Grpc.AspNetCore.Server.Model.Internal.ServiceRouteBuilder class*
      • ServerCallHandlerBase*, UnaryServerCallhandler*, ServerStreamingServerCallHandler*, ClientStreamingServerCallHandler*, and DuplexStreamingServerCallHandler* classes in Grpc.AspNetCore.Server.Internal.CallHandlers namespace
      • ServerMethodInvokerBase*, UnaryServerMethodInvoker*, ServerStreamingServerMethodInvoker*, ClientStreamingServerMethodInvoker*, and DuplexStreamingServerMethodInvoker* classes in Grpc.Shared.Server namespace
    • extracts shared interface between ServerCallHandlerFactory and ServerCallHandlerFactory<TService> into IServerCallHandlerFactory*
  • test

    • adds test cases for new overloads of MapGrpcService
  • examples

    • modifies examples/README.md
    • adds new example project examples/GreeterByServiceDefinition
    • appends implementation of Grpc.AspNetCore.Server.Tests.TestObjects.Services.WithAttribute.GreeterWithAttribute.BindService method

Describe alternatives you've considered

This commit contains concrete code as far as I can write, but I do not care about these implementations.
I welcome better ways to realize this suggestion.

Additional context

No response

@VAllens

VAllens commented Dec 30, 2024

Copy link
Copy Markdown

This is great and exactly what I needed.
Very useful for scenarios where a custom service definition is needed.
Now, any progress on this?
How should we move forward with this PR?

Currently, I copy the service code generated by Grpc.Tools and rewrite them.
Then having the specific service implementation class derive from me.
Follow the BindServiceMethod convention and let it be auto-bound.

@floozie

floozie commented Mar 27, 2025

Copy link
Copy Markdown

Is this ever going to be implemented?

@aka-nse

aka-nse commented Mar 30, 2025

Copy link
Copy Markdown
Contributor Author

@floozie
Although I'm monitoring this issue and keeping it in sync with the master branch, the lack of response from the owners is all I can do.
If I have made a mistake in the contribution process, I would be happy to be pointed it out.

Comment thread .github/workflows/test.yml
Comment thread examples/GreeterByServiceDefinition/Client/Client.csproj Outdated
@JamesNK

JamesNK commented May 26, 2025

Copy link
Copy Markdown
Member

Hi

I refactored your PR to reduce duplication. See changes here: #2634. Are you ok with using those changes?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants