Используйте 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.

(примечание: это не обязательно должно быть одноэлементным, но: это должно работать)

Другие вопросы по тегам