То, о чем вы говорите, является распространенным сценарием во многих приложениях / API.
Если вы смотрите на проблему с инженерной точки зрения, то я бы сделал следующее:
создать модель, которая отражает данные, возвращаемые из внешнего API.Давайте назовем это ApiSourceDataDto.
ваш API хочет взять эти данные, каким-то образом преобразовать их и вернуть новый формат, назовем его MyApiDataDto.
создайте дополнительный слой, сейчас давайте скажем новую библиотеку классов, в которую вы добавляете слой перевода из ApiSourceDataDto в ApiSourceDataDto.Допустим, у нас есть класс с именем TranslationLayer.
Вызовите этот класс из вашего контроллера, используя функциональный подход.
Под этим я подразумеваю, что ваш уровень перевода не будет иметь никаких знаний о внешнем API, все, что он знает, это то, что он получит некоторые данные в определенном формате, преобразует их и возвращает результат,ничего более.Это позволяет очень легко тестировать, потому что вы можете вводить данные любым способом и проверять, что происходит, без необходимости что-либо насмехаться.
Примерно так:
[HttpGet]
public List<MyApiDataDto> GetResults()
{
List<ApiSourceDataDto> externalApiResults = Webservice.GetResults().ToList();
List<MyApiDataDto> myResults = new TranslationLayer().Translate(externalApiResults)
return myResults;
}
в отдельномбиблиотека классов, допустим, у вас есть что-то вроде:
public class TranslationLayer{
public List<MyApiDataDto> Translate(List<ApiSourceDataDto> input)
{
//apply your business logic and transformations here.
//return the transformed data.
}
}
Теперь у вас есть SOC (разделение задач), и вы можете приступить к некоторому надлежащему тестированию ваших методов перевода.Ваш контроллер прост и не имеет большого количества кода, как и должно быть.Вам нужны тонкие, но не жирные контроллеры.
Конечно, это просто для того, чтобы дать вам начальную идею.Если у вас много методов перевода, то вам нужно выполнить разделение таким образом, чтобы это имело смысл для вашего приложения.Держите вещи отдельно и любую бизнес-логику вне контроллеров.
Конечно, вы также добавили бы некоторый код для обработки ошибок, возвращаемых внешним API.