Сериализатор RawRabbit .NET Core 2.2 / проблема с внедрением зависимостей

#asp.net-core-2.2 #rawrabbit

#asp.net-core-2.2 #rawrabbit

Вопрос:

У меня есть микросервис, основанный на .NET Core 2.2. Я использую RawRabbit (версия 2.0.0-beta9) в качестве служебной шины. С ним были установлены следующие пакеты:

 <PackageReference Include="RawRabbit" Version="2.0.0-beta9" />
<PackageReference Include="RawRabbit.DependencyInjection.ServiceCollection" Version="2.0.0-beta9" />
<PackageReference Include="RawRabbit.Operations.Publish" Version="2.0.0-beta9" />
<PackageReference Include="RawRabbit.Operations.Subscribe" Version="2.0.0-beta9" />
  

Вот как выглядит мой контроллер:

     private readonly IBusClient _busClient;

    //...constructor that inits the _busClient

    [HttpPost("")]
    public async Task<IActionResult> Post([FromBody] CreateActivity model)
    {
        model.Id = Guid.NewGuid();
        await _busClient.PublishAsync(model); //Exception thrown here
        return Accepted($"Activities/{model.Name}");
    }
  

Проблема возникает, когда код пытается выполнить следующее:

 await _busClient.PublishAsync(model);
  

Исключение, которое я получаю, это:

Исключение MISSINGMETHOD: метод не найден: ‘Аннулирует Newtonsoft.Json.JsonSerializer.set_TypeNameAssemblyFormat (System.Runtime.Сериализация.Форматирование.FormatterAssemblyStyle)’. RawRabbit.DependencyInjection.RawRabbitDependencyRegisterExtension <>c.b__0_1 (распознаватель IDependencyResolver)

……. больше текста …….

RawRabbit.BusClient.InvokeAsync (Action pipeCfg, Action contextCfg, токен CancellationToken) Actio.Api.Controllers.Activitescontroller.Опубликовать (модель CreateActivity) в activitescontroller.cs

далее следует код моего действия Post, как показано выше.

Следующее действие работает так, как ожидалось:

     [HttpGet]
    public IActionResult Get()
    {
        return Content("Hello from Actio API!");
    }
  

Я предположил, что это потому, что это действие не использует IBusClient . Итак, проблема должна была быть с RawRabbit. Я погуглил проблему и обнаружил проблему в репозитории RawRabbit GitHub. Решением было обновление до более новой версии на RawRabbit. Итак, я попытался выполнить обновление до 2.0.0-rc1 , но я получил некоторые синтаксические ошибки. Я определил класс Extensions , который определяет следующий метод:

 public static Task WithCommandHandlerAsync<TCommand>(this IBusClient bus, 
                ICommandHandler<TCommand> handler) where TCommand: ICommand
                => bus.SubscribeAsync<TCommand>(msg => handler.HandleAsync(msg),
                ctx => ctx.UseConsumerConfiguration(cfg => 
                    cfg.FromDeclaredQueue(q => q.WithName(GetQueueName<TCommand>()))));
  

Проблема, похоже, в UseConsumerConfiguration . Ошибка гласит:

Контекст ISubscribe не содержит определения для конфигурации UseConsumerConfiguration

Дополнительная информация: Я изучаю курс по .NET Microservices от Packt Publishing. Этот код, похоже, отлично работает для них с точно такими же пакетами.

Ответ №1:

Для всех, кто в будущем, вы должны выполнить следующее:

  1. RawRabbit 2.0.0-rc5 (последняя версия на момент написания). Включите предварительные версии.
  2. Измените конфигурацию UseConsumerConfiguration -> Конфигурацию UseSubscribeConfiguration
  3. Установите RawRabbit.Операции.Подписаться, потому что SubscribeAsync больше не будет распознаваться

Конечный результат должен выглядеть следующим образом:

 public static Task WithCommandHandlerAsync<TCommand>(this IBusClient bus,
            ICommandHandler<TCommand> handler) where TCommand : ICommand
            => bus.SubscribeAsync<TCommand>(msg => handler.HandleAsync(msg),
                ctx => ctx.UseSubscribeConfiguration(cfg => 
                    cfg.FromDeclaredQueue(q => q.WithName(GetQueueName<TCommand>()))));
  

Комментарии:

1. У меня это сработало, обновив все пакеты RawRabbit в действии. Установите Common.csproj на последнюю версию (2.0.0-rc5) и выполните шаги 2 и 3.

Ответ №2:

Обновите версию RawRabbit до 2.0.0-rc5

После этого используйте UseSubscribeConfiguration вместо UseConsumerConfiguration

Комментарии:

1. Я тоже пробовал это, но это не сработало. Вы пробовали это и заставили это работать?