将 protobuf-net RuntimeTypeModel 与 GrpcClient (AddCodeFirstGrpcClient) 一起使用
Posted
技术标签:
【中文标题】将 protobuf-net RuntimeTypeModel 与 GrpcClient (AddCodeFirstGrpcClient) 一起使用【英文标题】:Use protobuf-net RuntimeTypeModel with GrpcClient (AddCodeFirstGrpcClient) 【发布时间】:2020-09-22 09:41:15 【问题描述】:我尝试将自定义 protobuf-net RuntimeTypeModel 与 protobuf-net grpc 客户端库一起使用。 到目前为止我所了解的,我需要使用 ClientFactory 并设置一个引用我的 RuntimeTypeModel-Instance 的 binder-configuration。
var binderConfig = BinderConfiguration.Create(new List<MarshallerFactory>
ProtoBufMarshallerFactory.Create(_runtimeTypeModel)
);
var clientFactory = ClientFactory.Create(binderConfig)
如果我每次都自己创建客户端和底层 grpc 通道,这是可行的。
现在,我想通过 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。
这种方法有什么问题?
谢谢。 托尼
【问题讨论】:
【参考方案1】:你需要将ClientFactory
注册到DI层:
services.AddSingleton<ClientFactory>(clientFactory)
现在它应该正确地发现它。您应该不需要设置Creator
。
(注意:它不需要是单例,但是:应该可以)
【讨论】:
以上是关于将 protobuf-net RuntimeTypeModel 与 GrpcClient (AddCodeFirstGrpcClient) 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 xamarin ios pcl 中使用 protobuf-net
使用 Protobuf-net 将大数据文件流式传输为 IEnumerable
将 protobuf-net RuntimeTypeModel 编译为 C#,而不是 DLL
用于继承的 Protobuf-net .proto 文件生成
将 protobuf-net RuntimeTypeModel 与 GrpcClient (AddCodeFirstGrpcClient) 一起使用