Используйте protobuf-net RuntimeTypeModel с GrpcClient (AddCodeFirstGrpcClient)
Я пытаюсь использовать настраиваемую модель RuntimeTypeModel protobuf-net с клиентской библиотекой protobuf-net grpc. Насколько я понимаю, мне нужно использовать ClientFactory и установить конфигурацию связующего, которая ссылается на мой RuntimeTypeModel-Instance.
var binderConfig = BinderConfiguration.Create(new List<MarshallerFactory> {
ProtoBufMarshallerFactory.Create(_runtimeTypeModel)
});
var clientFactory = ClientFactory.Create(binderConfig)
Это работает, если я каждый раз создаю клиента и соответствующий канал grpc.
Теперь я хочу использовать GrpcClientFactory через DI, предоставленный пакетом nuget 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.
Что плохого в таком подходе?
Благодарю. Тони
1 ответ
Вам необходимо зарегистрировать
ClientFactory
со слоем DI:
services.AddSingleton<ClientFactory>(clientFactory)
Теперь он должен это правильно обнаружить. Вам не нужно устанавливать
Creator
.
(примечание: это не обязательно должно быть одноэлементным, но: это должно работать)