将protobuf-net RuntimeTypeModel与GrpcClientAddCodeFirstGrpcClient一起使用

问题描述

我尝试将自定义的protobuf-net RuntimeTypeModel与protobuf-net grpc客户端库一起使用。 到目前为止,我所了解的是,我需要使用ClientFactory并设置一个引用我的RuntimeTypeModel-Instance的绑定器配置。
var binderConfig = BinderConfiguration.Create(new List<MarshallerFactory> {
    ProtoBufMarshallerFactory.Create(_runtimeTypeModel)
}); 
var clientFactory = ClientFactory.Create(binderConfig)

如果我每次都创建客户端和基础的grpc-channel,这将起作用。

现在,我想通过nuget软件包 protobuf-net.grpc.ClientFactory

提供的DI使用GrpcclientFactory。

我不知道如何配置ClientFactory以使用我的自定义RuntimeTypeModel。在我的创业公司中,我尝试了以下方法

.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);
   };
});

我可以在控制器类中使用IMyGrpcService并获取有效的实例。但是,永远不会调用o.Creator委托,并且使用了错误的runtimeTypeModel。

这种方法有什么问题?

谢谢。 托尼

解决方法

您需要在DI层注册ClientFactory

services.AddSingleton<ClientFactory>(clientFactory)

现在应该正确发现它。您无需设置Creator

(注意:它不一定需要是单身人士,但应该可以)