@UnstableApi
    public <T> GrpcServiceBuilder addService(
            T implementation,
            Function<? super T, ServerServiceDefinition> serviceDefinitionFactory,
            Iterable<? extends Function<? super HttpService, ? extends HttpService>> decorators) {
        requireNonNull(implementation, "implementation");
        requireNonNull(serviceDefinitionFactory, "serviceDefinitionFactory");
        requireNonNull(decorators, "decorators");

        final ServerServiceDefinition serverServiceDefinition = serviceDefinitionFactory.apply(implementation);
        requireNonNull(serverServiceDefinition, "serviceDefinitionFactory.apply() returned null");
        registryBuilder.addService(serverServiceDefinition, implementation.getClass(),
                                   ImmutableList.copyOf(decorators));
        return this;
    }
Decorates an implementation of gRPC service with the given decorators, in the order of iteration.

<p>Most gRPC service implementations are {@link BindableService}s.
This method is useful in cases like the followings.

<p>Used for ScalaPB gRPC stubs

<pre>{@code
GrpcService.builder()
           .addService(new HelloServiceImpl,
                       HelloServiceGrpc.bindService(_,
                                                    ExecutionContext.global))}
</pre>

<p>Used for intercepted gRPC-Java stubs
<pre>{@code
GrpcService.builder()
           .addService(new TestServiceImpl,
                       impl -> ServerInterceptors.intercept(impl, interceptors));
}</pre>

<p>For more details on decorator behavior, please refer to the following document.

@see <a href="https://armeria.dev/docs/server-grpc#decorating-a-grpcservice">Decorating a GrpcService</a>
grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilder.java