Я пишу некоторые API, используя Refit , который творит чудеса, и у меня возникают проблемы с поиском хорошего (как в «чистом», «правильном») способа выполнения некоторой произвольной обработки на возвращенные данные.
В качестве примера рассмотрим этот код:
public interface ISomeService
{
[Get("/someurl/{thing}.json")]
Task<Data> GetThingAsync([AliasAs("thing")] string thing);
}
Теперь многие REST API, которые я видел, имеют неудачную привычку упаковывать фактические данные (как в «полезных» данных) глубоко в ответ JSON. Скажем, фактический JSON имеет такую структуру:
{
"a" = {
"b" = {
"data" = {
...
}
Теперь обычно я просто сопоставляю все необходимые модели, что позволит Refit правильно десериализовать ответ. Это, однако, делает API немного неуклюжим в использовании, поскольку каждый раз, когда я его использую, мне приходится делать что-то вроде:
var response = await SomeService.GetThingAsync("foo");
var data = response.A.B.Data;
Что я говорю, так это то, что эти две внешние модели на самом деле являются просто контейнерами, которые не нужно показывать пользователю. Или, скажем, свойство Data
- это модель, у которой есть другое свойство, IEnumerable
, я вполне мог бы просто захотеть напрямую вернуть это пользователю.
Я понятия не имею, как это сделать без необходимости писать бесполезные классы-обертки для каждого сервиса, где каждому также придется явно повторять все комментарии XML в интерфейсах и т. Д., Что приводит к еще большему бесполезному коду, плавающему вокруг .
Мне просто хотелось бы иметь некоторый простой, необязательный Func<T, TResult>
эквивалент, который вызывается в результате выполнения данного API Refit и вносит некоторые изменения в возвращенные данные перед тем, как представить их пользователю.