Comment générer des fichiers .proto ou utiliser «Code First gRPC» à partir de classes C #?


9

Je veux utiliser gRPC avec .NET core 3 dans une application web asp.net core. Comment générer le fichier .proto nécessaire à partir d'une classe C # existante et d'objets de modèle? Je ne veux pas réécrire un fichier .proto qui reflète le code existant, je veux que le fichier .proto soit généré automatiquement à partir des objets de classe et de modèle.

J'appelle cette méthode pour enregistrer ma classe de service.

builder.MapGrpcService<MyGrpcService>();

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

ModelObjecta [DataContract]et [DataMember]avec des attributs de commande.

Est-ce possible? Chaque exemple que je vois en ligne commence par un .protofichier. J'ai déjà défini mes méthodes de service souhaitées dans la MyGrpcServiceclasse. Mais c'est peut-être juste en arrière par rapport à la façon standard de faire les choses ...

Quelque chose comme l'ancien accès distant .NET serait idéal où vous pouvez simplement demander une interface à partir d'un point d'extrémité distant et qu'il utilise comme par magie gRPCpour communiquer d'avant en arrière, mais c'est peut-être une vue trop simpliste.


J'ai trouvé cette vidéo très utile pour commencer avec gRPC.
RobIII

1
Oui, la "manière standard de faire les choses" avec gRPC consiste à spécifier d'abord la spécification .proto, puis à utiliser un générateur de code pour créer le code nécessaire.
phuzi

Merci pour le lien vidéo, j'ai déjà passé ces derniers jours à me familiariser avec le fonctionnement des fichiers .proto et de gRPC, j'ai juste un grand nombre d'interfaces et d'objets de modèle avec lesquels j'espérais pouvoir travailler avec l'auto-outillage ... mais peut-être n'y a-t-il pas moyen de contourner la réécriture d'un wrapper et de générer des fichiers .proto avec un outil ou d'échouer manuellement à écrire les fichiers .proto.
jjxtra

Pour l'interopérabilité C # à C #, AddCodeFirstGrpc de protobuf-net.Grpc est la voie à suivre. Le client peut alors accéder au service Grpc avec juste une interface, une adresse IP et un port en utilisant protobuf-net.Grpc. Si vous avez besoin de l'interopérabilité d'un autre langage appelant votre service C # grpc, vous pouvez générer une .proto à partir du code C #, voir stackoverflow.com/questions/1334659/… .
jjxtra

Réponses:


5

Vous pouvez utiliser celui de Marc Gravell protobuf-net.Grpcpour cela. Avoir une expérience de code-premier lors de la création de services gRPC est le cas d'utilisation exact pourquoi il a commencé à travailler dessus. Il s'appuie sur protobuf-netce qui ajoute déjà des capacités de sérialisation entre les types C # et protobuf.

Consultez la documentation pour voir comment commencer à utiliser la bibliothèque, ou même regardez Marc présenter ce sujet dans l'un des enregistrements suivants de son discours «Parler entre les services avec gRPC et d'autres astuces»:

Je pense qu'il a en fait mis à jour celui de septembre pour les bits de sortie de .NET Core 3.0, donc ce serait probablement la version la plus mise à jour.

Il y a aussi quelques exemples de code pour voir à quoi cela ressemble lorsque vous le configurez.


Merci, j'aurai une montre, j'espère que la plupart d'entre elles peuvent être automatisées
jjxtra

Vidéo 1 heure et 2 minutes est l'endroit où il commence à parler du code en premier
jjxtra

La pièce côté client semble parfaite, tout comme la télécommande .NET, essayant toujours de trouver où il configure le serveur :)
jjxtra

Je pense qu'il est préférable de consulter la documentation pour cela. Il y a une explication étape par étape à ce sujet :)
poke

1
@jjxtra il y a une "mise en route" et tous les exemples des discussions, sur GitHub
Marc Gravell
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.