Пользовательский результат возврата в WebAPI - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть довольно тривиальный WebAPI, который возвращает результат из другого веб-сервиса.

    [HttpGet]
    public List<MyList> GetResults()
    {
        var result = Webservice.GetResults().ToList();

        return result; 
    }

Вышеприведенное возвращает все значения из вызова Webservice и с теми же именами проп.

У меня вопрос: как мне получить данные из WebService, расширить некоторые данные своими собственными данными, изменить некоторые имена проп, а затем вернуть этот новый результат?Без использования Automapper или подобных компонентов?

    [HttpGet]
    public List<MyList> GetResults()
    {
            var result = Webservice.GetResults().ToList();

    foreach (res in results) {
        var newTitle = result.Title + " - my custom value";
        var newData = "01/01/2019";
        var newLink = GetCustomLink(result);
    }       

        return newValues; 
    } 

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

вы также можете использовать методы LINQ, такие как:

[HttpGet]
    public List<MyList> GetResults()
    {
            var result = Webservice.GetResults().ToList();





    return results.Select(xx=> new MyList{ // ,-- HERE YOU CAN ALSO USE A GENERIC NEW
                  newTitle = result.Title + " - my custom value",
                  newData = "01/01/2019",
                  newLink = GetCustomLink(result)
              }).ToList()

    } 

... then .. если это отображение является повторяющимся .. вы можете создать метод расширения, чтобы сделать это следующим образом:

public static MyList ToMyCustomType(this YOURWSTYPE input){

return new MyList{
           newTitle = result.Title + " - my custom value",
           newData = "01/01/2019",
           newLink = GetCustomLink(result)
}
}

public static List<MyList> ToMyCustomType(this IEnumerable<YOURWSTYPE> input){
 return input.Select(xx=> xx.ToMyCustomType()).ToList();
}

... и тогда вы можете использовать его как:

  [HttpGet]
    public List<MyList> GetResults()
    {
           return  Webservice.GetResults().ToList().ToMyCustomType();


    } 

Надеюсь, это поможет вам !!

0 голосов
/ 01 февраля 2019

вы можете использовать Select extension of Linq для создания собственного результата.

 var result = Webservice.GetResults().ToList();
 return result.Select( s => new MyList{
            newTitle = result.Title + " - my custom value",
            newData = "01/01/2019",
            newLink = GetCustomLink(result)
        });
0 голосов
/ 01 февраля 2019

То, о чем вы говорите, является распространенным сценарием во многих приложениях / 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...