Повторная проверка ответов

Кто-нибудь использовал FluentValidation в сочетании с Refit Client?

В рамках системы, над которой я работаю, я обращаюсь к различным службам REST и хотел бы использовать FluentValidation для единообразной проверки типизированных ответов.

Очевидно, я мог бы вручную проверять после каждого вызова встроенного клиента Refit, но мне было интересно, есть ли какая-либо возможность для автоматического поиска соответствующих валидаторов и их вызова.

Думаю, я смотрю на что-то похожее на шаблон поведения проверки в Mediatr.

Пара мыслей, которые у меня были:

1. Украсьте каждый клиентский интерфейс проверяющей оболочкой

Это потребовало бы использования контейнера IoC, который поддерживает оформление, и означало бы, что мне пришлось бы создать реализацию каждого клиентского интерфейса, который затем проверял бы ответы, возвращаемые после переоснащения.

2. Добавьте проверяющий DelegatingHandler в конвейер.

Это, вероятно, приведет к необходимости десериализовать содержимое — выполнить проверку — и затем вернуть ответ следующему обработчику в цепочке. Это, вероятно, нормально, когда контент небольшой...

3. Используйте собственный проверяющий JsonConverter

Здесь я бы обернул преобразователь Json.Net и в Deserialize выполнил проверку.

Или есть какая-то функция Refit, которую я пропустил, которая могла бы помочь с этим, или то, что я предлагаю, просто кажется сумасшедшим?!

Спасибо,

Ник.


person Nick    schedule 08.01.2021    source источник
comment
Я бы использовал собственный ContentSerializer, который обертывает NewtonsoftJsonContentSerializer, но также выполняет вашу проверку, а затем возвращает проверенный десериализованный объект. Я бы ничего не делал в DelegatingHandler, так как это было раньше, например. код ответа проверяется   -  person canton7    schedule 08.01.2021
comment
@canton7, да, я начинаю думать, что это лучший способ. Я был обеспокоен тем, что он будет навязывать JSON пользователю, однако IContentSerializer не зависит от формата, поэтому он может так же легко обернуть сериализатор XML. Думаю, я просто подумал, что полезной функцией Refit может быть возможность перехватывать типизированные запросы и ответы в библиотеке. Это похоже на небольшое злоупотребление SRP.   -  person Nick    schedule 08.01.2021
comment
Эх, как автор конкурирующей библиотеки, которая использует аналогичный подход, я вижу роль уровня десериализации в возвращении десериализованного, действительного объектного представления ответа. Json.net выполнит здесь некоторый уровень проверки (например, недопустимые строки json отклоняются), но дополнительная проверка на уровне модели не сильно отличается и находится на том же уровне. Я бы избегал нескольких точек внедрения на одном слое, между которыми были бы только семантические различия — так возникает путаница.   -  person canton7    schedule 08.01.2021
comment
Да, проверка определенно связана с десериализацией, так что вы правы. Я полагаю, что ни у кого больше не возникало каких-либо сквозных проблем, которые оправдывали бы добавление шаблона поведения в Refit.   -  person Nick    schedule 08.01.2021
comment
PS. Как называется ваша конкурирующая библиотека?   -  person Nick    schedule 08.01.2021
comment
RestEase   -  person canton7    schedule 08.01.2021


Ответы (1)


Я использовал mediatr и refit, и мы использовали такой шаблон:

  • (В универсальном обработчике конвейера) Проверка команды/запроса в обработчике (ах)

    В случае неудачи => 400 со стандартными результатами проверки

  • Обработчик вызовов.....

    Сделать http-вызов в обработчике

    Ответ от API возвращается.

    Если переустановить apiResponse, выдайте ошибку 400 с ошибками проверки ==>

    (В универсальном обработчике конвейера) проверьте файл apiResponse. Если 400 искать ошибки проверки (это были наши собственные вещи, поэтому мы могли с ними справиться) и передавать их обратно вызывающей стороне с 400 и стандартными результатами проверки.

Все это будет проходить через уровни API с минимальным (без) вводом разработчика, а пользовательский интерфейс будет отображать результаты по-своему.

И если вы хотите использовать стандартный ответ об ошибке, возможно, посмотрите на это: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.problemdetails?view=aspnetcore-5.0 Используется в моем последнем проекте!

Работал как шарм!

person PaulD    schedule 12.05.2021