Wie generiere ich .proto-Dateien oder verwende 'Code First gRPC' aus C # -Klassen?

9

Ich möchte gRPC mit .NET Core 3 in einer asp.net Core-Webanwendung verwenden. Wie generiere ich die erforderliche .proto-Datei aus einer vorhandenen C # -Klasse und Modellobjekten? Ich möchte keine .proto-Datei neu schreiben, die den vorhandenen Code widerspiegelt. Ich möchte, dass die .proto-Datei automatisch aus den Klassen- und Modellobjekten generiert wird.

Ich rufe diese Methode auf, um meine Serviceklasse zu registrieren.

builder.MapGrpcService<MyGrpcService>();

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

ModelObjecthat [DataContract]und [DataMember]mit Auftragsattributen.

Ist das möglich? Jedes Beispiel, das ich online sehe, beginnt mit einer .protoDatei. Ich habe meine gewünschten Servicemethoden bereits in der MyGrpcServiceKlasse definiert. Aber vielleicht ist dies nur rückwärts zu der üblichen Vorgehensweise ...

So etwas wie das alte .NET-Remoting ist ideal, wenn Sie einfach von einem Remote-Endpunkt aus nach einer Schnittstelle fragen können, die auf magische Weise gRPCzum Hin- und Herkommunizieren verwendet wird, aber vielleicht ist das eine zu vereinfachte Ansicht.

jjxtra
quelle
Ich fand dieses Video sehr hilfreich, um mit gRPC zu beginnen.
RobIII
1
Ja, die "Standardmethode" mit gRPC besteht darin, zuerst die .proto-Spezifikation anzugeben und dann mit einem Codegenerator den erforderlichen Code zu erstellen.
Phuzi
Vielen Dank für den Videolink. Ich habe bereits die letzten Tage damit verbracht, mich mit der Funktionsweise von .proto-Dateien und gRPC vertraut zu machen. Ich habe nur eine große Anzahl von Schnittstellen und Modellobjekten, mit denen ich gehofft hatte, dass einige Auto-Tools funktionieren ... Aber vielleicht führt kein Weg daran vorbei, einen Wrapper neu zu schreiben und .proto-Dateien mit einem Tool zu generieren oder die manuellen .proto-Dateien manuell zu schreiben.
jjxtra
Für C # zu C # Interop ist AddCodeFirstGrpc von protobuf-net.Grpc der richtige Weg. Der Client kann dann mit protobuf-net.Grpc mit nur einer Schnittstelle, einer IP-Adresse und einem Port auf den Grpc-Dienst zugreifen. Wenn Sie eine Interop einer anderen Sprache benötigen, die Ihren C # grpc-Dienst aufruft, können Sie aus C # -Code ein .proto generieren, siehe stackoverflow.com/questions/1334659/… .
jjxtra

Antworten:

5

Sie können Marc Gravell's protobuf-net.Grpcdafür verwenden. Eine Code-First-Erfahrung beim Erstellen von gRPC-Diensten ist der genaue Anwendungsfall, warum er damit begonnen hat, daran zu arbeiten. Darüber hinaus werden protobuf-netSerialisierungsfunktionen zwischen C # -Typen und Protobuf hinzugefügt.

Lesen Sie in der Dokumentation nach, wie Sie mit der Verwendung der Bibliothek beginnen können, oder sehen Sie sich sogar an, wie Marc dieses Thema in einer der folgenden Aufzeichnungen seines Vortrags „Mit gRPC und anderen Tricks zwischen Diensten sprechen“ vorstellt:

Ich denke, er hat tatsächlich die im September für die Release-Bits von .NET Core 3.0 aktualisiert, so dass dies wahrscheinlich die aktuellere Version wäre.

Es gibt auch einige Codebeispiele, um zu sehen, wie dies beim Einrichten aussieht.

Sack
quelle
Danke, ich werde eine Uhr haben, hoffentlich kann das meiste davon automatisiert werden
jjxtra
Video 1 Stunde und 2 Minuten markiert, wo er zuerst über Code spricht
jjxtra
Das clientseitige Teil sieht perfekt aus, genau wie .NET-Remoting, und versucht immer noch herauszufinden, wo er den Server
einrichtet
Ich denke, es ist am besten, die Dokumentation dafür zu lesen. Es gibt eine Schritt-für-Schritt-Erklärung dazu :)
Poke
1
@jjxtra gibt es ein "Erste Schritte" und alle Beispiele aus den Gesprächen auf GitHub
Marc Gravell