|  | @@ -609,6 +609,39 @@ void GenerateBindServiceMethod(Printer* out, const ServiceDescriptor* service) {
 | 
	
		
			
				|  |  |    out->Print("\n");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void GenerateBindServiceWithBinderMethod(Printer* out,
 | 
	
		
			
				|  |  | +                                         const ServiceDescriptor* service) {
 | 
	
		
			
				|  |  | +  out->Print(
 | 
	
		
			
				|  |  | +      "/// <summary>Register service method implementations with a service "
 | 
	
		
			
				|  |  | +      "binder. Useful when customizing the service binding logic.</summary>\n");
 | 
	
		
			
				|  |  | +  out->Print(
 | 
	
		
			
				|  |  | +      "/// <param name=\"serviceBinder\">Service methods will be bound by "
 | 
	
		
			
				|  |  | +      "calling <c>AddMethod</c> on this object."
 | 
	
		
			
				|  |  | +      "</param>\n");
 | 
	
		
			
				|  |  | +  out->Print(
 | 
	
		
			
				|  |  | +      "/// <param name=\"serviceImpl\">An object implementing the server-side"
 | 
	
		
			
				|  |  | +      " handling logic.</param>\n");
 | 
	
		
			
				|  |  | +  out->Print(
 | 
	
		
			
				|  |  | +      "public static void BindService(grpc::ServiceBinderBase serviceBinder, "
 | 
	
		
			
				|  |  | +      "$implclass$ "
 | 
	
		
			
				|  |  | +      "serviceImpl)\n",
 | 
	
		
			
				|  |  | +      "implclass", GetServerClassName(service));
 | 
	
		
			
				|  |  | +  out->Print("{\n");
 | 
	
		
			
				|  |  | +  out->Indent();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for (int i = 0; i < service->method_count(); i++) {
 | 
	
		
			
				|  |  | +    const MethodDescriptor* method = service->method(i);
 | 
	
		
			
				|  |  | +    out->Print(
 | 
	
		
			
				|  |  | +        "serviceBinder.AddMethod($methodfield$, serviceImpl.$methodname$);\n",
 | 
	
		
			
				|  |  | +        "methodfield", GetMethodFieldName(method), "methodname",
 | 
	
		
			
				|  |  | +        method->name());
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  out->Outdent();
 | 
	
		
			
				|  |  | +  out->Print("}\n");
 | 
	
		
			
				|  |  | +  out->Print("\n");
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void GenerateService(Printer* out, const ServiceDescriptor* service,
 | 
	
		
			
				|  |  |                       bool generate_client, bool generate_server,
 | 
	
		
			
				|  |  |                       bool internal_access) {
 | 
	
	
		
			
				|  | @@ -637,6 +670,7 @@ void GenerateService(Printer* out, const ServiceDescriptor* service,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (generate_server) {
 | 
	
		
			
				|  |  |      GenerateBindServiceMethod(out, service);
 | 
	
		
			
				|  |  | +    GenerateBindServiceWithBinderMethod(out, service);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    out->Outdent();
 |