¿Cómo genero archivos .proto o uso 'Code First gRPC' de las clases de C #?

9

Quiero usar gRPC con .NET core 3 en una aplicación web básica asp.net. ¿Cómo genero el archivo .proto necesario a partir de una clase C # existente y objetos de modelo? No quiero volver a escribir un archivo .proto que refleje el código existente, quiero que el archivo .proto se genere automáticamente a partir de los objetos de clase y modelo.

Llamo a este método para registrar mi clase de servicio.

builder.MapGrpcService<MyGrpcService>();

public class MyGrpcService
{
    public Task<string> ServiceMethod(ModelObject model, ServerCallContext context)
    {
        return Task.FromResult("It Worked");
    }
}

ModelObjecttiene [DataContract]y [DataMember]con atributos de orden.

es posible? Cada ejemplo que veo en línea comienza con un .protoarchivo. Ya he definido mis métodos de servicio deseados en la MyGrpcServiceclase. Pero tal vez esto es solo hacia atrás a lo que es la forma estándar de hacer las cosas ...

Algo así como el antiguo control remoto .NET sería ideal donde solo puede solicitar una interfaz desde un punto final remoto y se usa mágicamente gRPCpara comunicarse de un lado a otro, pero tal vez esa sea una vista demasiado simplista.

jjxtra
fuente
Encontré este video muy útil para comenzar con gRPC.
RobIII
1
Sí, la "forma estándar de hacer las cosas" con gRPC es especificar primero la especificación .proto y luego usar un generador de código para crear el código necesario.
phuzi el
Gracias por el enlace del video, ya me he pasado los últimos días familiarizándome con el funcionamiento de los archivos .proto y gRPC, solo tengo una gran cantidad de interfaces y objetos de modelo con los que esperaba que funcionaran algunas herramientas automáticas ... pero tal vez no hay forma de evitar reescribir un contenedor y generar archivos .proto con una herramienta o fallar al escribir manualmente los archivos .proto.
jjxtra
Para interoperabilidad C # a C #, AddCodeFirstGrpc de protobuf-net.Grpc es el camino a seguir. El cliente puede acceder al servicio Grpc con solo una interfaz, ip y puerto usando protobuf-net.Grpc. Si necesita interoperabilidad de algún otro idioma que llame a su servicio C # grpc, puede generar un .proto a partir del código C #, consulte stackoverflow.com/questions/1334659/… .
jjxtra

Respuestas:

5

Puedes usar Marc Gravell protobuf-net.Grpcpara esto. Tener una experiencia de código primero al crear servicios gRPC es el caso de uso exacto por el que comenzó a trabajar en él. Se basa además de lo protobuf-netcual ya agrega capacidades de serialización entre los tipos de C # y protobuf.

Consulte la documentación para ver cómo comenzar a usar la biblioteca, o incluso vea a Marc presentar este tema en una de las siguientes grabaciones de su charla "Hablando entre servicios con gRPC y otros trucos":

Creo que en realidad actualizó el de septiembre para los bits de lanzamiento de .NET Core 3.0, por lo que probablemente sería la versión más actualizada.

También hay algunos ejemplos de código para ver cómo se ve esto cuando lo configura.

dar un toque
fuente
Gracias, tendré un reloj, espero que la mayoría se pueda automatizar
Jjxtra
El video de 1 hora y 2 minutos es donde comienza a hablar sobre el código primero
jjxtra
La pieza del lado del cliente se ve perfecto, al igual que la comunicación remota de .NET, todavía tratando de encontrar donde instala el servidor :)
jjxtra
Creo que es mejor consultar la documentación para eso. Hay una explicación paso a paso sobre eso :)
toque el
1
@jjxtra hay un "comienzo" y todos los ejemplos de las conversaciones, en GitHub
Marc Gravell