i try to use a custom protobuf-net RuntimeTypeModel with the protobuf-net grpc client library. What I understand so far, I need to to use the ClientFactory and set a binder-configuration which references my RuntimeTypeModel-Instance.
var binderConfig = BinderConfiguration.Create(new List<MarshallerFactory> {
ProtoBufMarshallerFactory.Create(_runtimeTypeModel)
});
var clientFactory = ClientFactory.Create(binderConfig)
This is working, if i create the client and the underlying grpc-channel every time myself.
Now, I want to use the GrpcClientFactory via DI provided by the nuget package protobuf-net.Grpc.ClientFactory
I don't know, how to configure the ClientFactory to use my custom RuntimeTypeModel. In my startup I tried the following:
.AddCodeFirstGrpcClient<IMyGrpcService>(o =>
{
o.Address = new Uri("https://localhost:5001");
o.Creator = (callInvoker) =>
{
var servicesProvider = services.BuildServiceProvider();
var binderConfig = BinderConfiguration.Create(new List<MarshallerFactory> {
ProtoBufMarshallerFactory.Create(servicesProvider.GetService<RuntimeTypeModel>())
});
var clientFactory = ClientFactory.Create(binderConfig);
return clientFactory.CreateClient<IMyGrpcService>(callInvoker);
};
});
I can use IMyGrpcService in my controller classes and get a valid instance. But the o.Creator delegate is never called and the wrong runtimeTypeModel is used.
What is wrong with this approach?
Thanks. Toni
You need to register the
ClientFactory
with the DI layer:Now it should discover it correctly. You should not need to set the
Creator
.(note: it doesn't specifically need to be a singleton, but: that should work)