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.

jjxtra
la source
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.

poussée
la source
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