Como gerar arquivos .proto ou usar 'Code First gRPC' das classes C #?

9

Quero usar o gRPC com o .NET core 3 em um aplicativo da web principal do asp.net. Como eu gero o arquivo .proto necessário a partir de uma classe C # existente e objetos de modelo? Não quero reescrever um arquivo .proto que espelha o código existente, quero que o arquivo .proto seja gerado automaticamente a partir dos objetos de classe e modelo.

Eu chamo esse método para registrar minha classe de serviço.

builder.MapGrpcService<MyGrpcService>();

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

ModelObjectpossui [DataContract]e [DataMember]com atributos de pedido.

Isso é possível? Cada exemplo que vejo online começa com um .protoarquivo. Eu já defini meus métodos de serviço desejados na MyGrpcServiceclasse. Mas talvez isso seja apenas o contrário da maneira padrão de fazer as coisas ...

Algo parecido com o antigo sistema de comunicação remota do .NET seria ideal onde você pode simplesmente solicitar uma interface a partir de um ponto de extremidade remoto e ele magicamente usa gRPCpara se comunicar, mas talvez essa seja uma visão muito simplista.

jjxtra
fonte
Achei este vídeo muito útil para começar a usar o gRPC.
11139 RobIII em
11
Sim, a "maneira padrão de fazer as coisas" com o gRPC é especificar primeiro a especificação .proto e depois usar um gerador de código para criar o código necessário.
phuzi 8/11/19
Obrigado pelo link do vídeo, eu já passei os últimos dias me familiarizando com o funcionamento de arquivos .proto e gRPC, apenas com um grande número de interfaces e objetos de modelo com os quais esperava trabalhar com ferramentas automáticas ... mas talvez não haja como reescrever um wrapper e gerar arquivos .proto com uma ferramenta ou falhar manualmente com a gravação manual dos arquivos .proto.
jjxtra
Para interoperabilidade de C # a C #, AddCodeFirstGrpc do protobuf-net.Grpc é o caminho a percorrer. O cliente pode acessar o serviço Grpc com apenas uma interface, IP e porta usando protobuf-net.Grpc. Se você precisar da interoperabilidade de algum outro idioma que chame o serviço C # grpc, poderá gerar um .proto a partir do código C #, consulte stackoverflow.com/questions/1334659/… .
Jjxtra #

Respostas:

5

Você pode usar Marc Gravell protobuf-net.Grpcpara isso. Ter uma experiência de primeiro código ao criar serviços de gRPC é o caso de uso exato do motivo pelo qual ele começou a trabalhar nele. Ele é desenvolvido sobre o protobuf-netqual já adiciona recursos de serialização entre tipos de C # e protobuf.

Confira a documentação para ver como começar a usar a biblioteca ou assista a Marc apresentar este tópico em uma das seguintes gravações de sua palestra “Conversando entre serviços com gRPC e outros truques”:

Eu acho que ele realmente atualizou o de setembro para os bits de lançamento do .NET Core 3.0, então essa provavelmente seria a versão mais atualizada.

Existem também alguns exemplos de código para ver como isso ocorre quando você o configura.

cutucar
fonte
Graças eu vou ter um relógio, espero que a maior parte dele pode ser automatizado
jjxtra
Video 1 hora e 2 minutos marca é onde ele começa a falar sobre o código primeiro
jjxtra
A peça do lado do cliente parece perfeito, assim como .NET comunicação remota, ainda tentando descobrir onde ele configura o servidor :)
jjxtra
Eu acho que é melhor verificar a documentação para isso. Há uma explicação passo-a-passo sobre isso :)
picar
11
@jjxtra existe um "começo" e todos os exemplos das palestras, no GitHub
Marc Gravell