将 protobuf-net RuntimeTypeModel 与 GrpcClient (AddCodeFirstGrpcClient) 结合使用
Use protobuf-net RuntimeTypeModel with GrpcClient (AddCodeFirstGrpcClient)
我尝试将自定义 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 包提供的 DI 使用 GrpcClientFactory protobuf-net.Grpc.ClientFactory
我不知道如何配置 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
.
(注意:它并不特别需要是单例,但是:应该可以)
我尝试将自定义 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 包提供的 DI 使用 GrpcClientFactory protobuf-net.Grpc.ClientFactory
我不知道如何配置 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
.
(注意:它并不特别需要是单例,但是:应该可以)