Как связать grpc message з MediatR?

Ссылка скопирована
2 ответов

Здравствуйте!

Задание
Принимать на вход в asp.net web api endpoint модель в виде byte[], эта модель будет путешествовать далее через MediatR. Нужно использовать gRPC (.proto файлы) для бинарной сериализации данных.

Проблема
Для того, что бы эта модель прошла через MediatR, это должен быть IRequest<T>, но я не понимаю, как сказать, что proto-message должен быть IRequest. В генерируемом коде это сообщение помечено как public sealed partial class, но я не могу его даже так реализовать как partial class, из-за модификатора sealed (Странно, почему тогда генерируется partial)

Дополнительно:

Ответы:

IRequest<ByteString>

  • Это возвращаемый параметр, а мне нужно что бы сам message реализовал IRequest, это вообще возможно?
  • Nik Faraday, В message у вас будет тип bytes
    rpc SetImage(bytes) returns (...);
    или
    rpc SetImage(SetRequest) returns (...);
    message SetRequest
    {
    bytes Data = 1;
    }
  • Петр, нет, это не grpc эндпоинты, а именно message. Тут используются api-enpoint's и grps-messages

Почему не сделать отдельный IRequest, у которого единственное поле - этот массив байтов модели?
Либо при получении этого массива делай его парсинг и создавай отдельный, готовый класс модели IRequest

  • Потому что IRequest часть библиотеки MediatR
  • Nik Faraday, знаю, но проблема здесь в том, чтобы просто подружить grpc и mediatr. Поэтому достаточно просто маппить объекты из этих 2 миров: вручную или каким-нибудь Mapster'ом
  • Сергей Соловьев, да, в этом и проблема, что бы их сдружить)

    вручную или каким-нибудь Mapster'ом

    Такое не походит. Мне главное было услышать, возможно ли это классическим методами или нет

  • Nik Faraday, если код для grpc генерируется вручную (т.е. не предкомпилированный), то просто надо взять этот сгенерированный код и подправить под себя.
    я так уже делал, главное логику парсинга и т.д. не трогать
  • Сергей Соловьев, генерируется сам, не могу ничего сделать внутри. Я так понял, что тут уже больше без вариантов :(
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Анна SEO Ответ

Для связывания gRPC message с MediatR вам нужно создать отдельный класс-запрос, который будет представлять ваш gRPC message и передавать его в MediatR pipeline для обработки.

Вот пример того, как это можно сделать в C#:

1. Создайте класс-запрос, который будет представлять ваш gRPC message. Например, если у вас есть gRPC message с именем MyMessage, создайте класс-запрос с таким же именем:

public class MyMessageRequest : IRequest
{
    public MyMessage MyMessage { get; set; }
}

public class MyMessageRequest : IRequest { public MyMessage MyMessage { get; set; } }

2. Создайте обработчик для этого запроса в MediatR. Например, если у вас есть сервис, который обрабатывает ваш gRPC message и возвращает ответ, создайте класс-обработчик:

public class MyMessageHandler : IRequestHandler
{
    public Task Handle(MyMessageRequest request, CancellationToken cancellationToken)
    {
        // Обработка вашего gRPC message здесь
        MyMessageResponse response = SomeService.ProcessMessage(request.MyMessage);
 
        return Task.FromResult(response);
    }
}

public class MyMessageHandler : IRequestHandler { public Task Handle(MyMessageRequest request, CancellationToken cancellationToken) { // Обработка вашего gRPC message здесь MyMessageResponse response = SomeService.ProcessMessage(request.MyMessage); return Task.FromResult(response); } }

3. Затем в вашем контроллере или сервисе, который получает gRPC message, создайте объект класса-запроса и передайте его в Mediator для обработки:

var request = new MyMessageRequest { MyMessage = receivedGrpcMessage };
MyMessageResponse response = await mediator.Send(request);

var request = new MyMessageRequest { MyMessage = receivedGrpcMessage }; MyMessageResponse response = await mediator.Send(request);

Таким образом, вы связали ваш gRPC message с MediatR, позволяя легко обрабатывать его в вашем приложении. Не забудьте добавить все необходимые зависимости и настройки для работы MediatR в вашем проекте.

Другие ответы (1) Ответить на вопрос
Игорь Волков

Для связывания gRPC сообщений с MediatR вам потребуется создать промежуточный слой, который будет преобразовывать gRPC сообщения в объекты, понятные MediatR, и наоборот.

Начнем с создания класса-помощника, который будет выполнять эту конвертацию. Давайте назовем его `GrpcMediatrHelper`.

```php
class GrpcMediatrHelper
{
public static function grpcMessageToRequest($grpcMessage)
{
// Преобразование gRPC сообщения в объект запроса MediatR
// Например, вы можете использовать protobuf для десериализации сообщения
// и создать экземпляр объекта запроса MediatR
}

public static function responseToGrpcMessage($response)
{
// Преобразование объекта ответа MediatR в gRPC сообщение
// Например, сериализуйте объект ответа в protobuf формат
// и верните gRPC сообщение
}
}
```

Теперь, когда у нас есть этот класс-помощник, мы можем использовать его в обработчиках MediatR. Например, в обработчике запроса:

```php
class MyRequestHandler implements RequestHandler
{
public function handle(MyRequest $request): MyResponse
{
// Преобразуем gRPC сообщение в объект запроса MediatR
$mediatrRequest = GrpcMediatrHelper::grpcMessageToRequest($request);

// Обрабатываем запрос с помощью MediatR
$response = $this->mediator->handle($mediatrRequest);

// Преобразуем ответ MediatR в gRPC сообщение
return GrpcMediatrHelper::responseToGrpcMessage($response);
}
}
```

Таким образом, вы можете связать gRPC сообщения с MediatR, используя класс-помощник для конвертации данных между этими двумя механизмами. Не забудьте настроить вашу конфигурацию gRPC сервера, чтобы использовать обработчики, которые будут использовать этот подход.

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно