C # - как обрабатывать подобные типы данных при работе с API - PullRequest
0 голосов
/ 15 сентября 2018

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

Я начинаю вызывать API и получаю обратно список:

{
  "firstName": <value>
}

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

{
   "firstName": <value>
   "dateUpdated": <date>
}

Этот API теперь возвращает мне список похожих типов (но с подчеркиванием):

{
  "user_name": <value>
  "date_updated": <value>
}

Затем я получаю такие данные

{
   "UserName": <value>
   "DateUpdated": <value>
}

Это так расстраивает, потому чтоЯ должен создавать все эти разные модели все время.Не говоря уже о том, что мне приходится постоянно конвертировать из одного в другое, и я получаю такой код конвертации повсюду в своих сервисах:

var tempWidget = new Widget(){
  firstName = returnedWidget.FirstName,
  dateUpdated = returnedWidget.DateUpdated
}
return tempWidget

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Вы можете попробовать создать одну модель и несколько интерфейсов для нужных вам полей. У вас все еще есть интерфейсы, но при добавлении это намного легче, чем прикасаться к вашей модели, и вы сохраняете одно место для всех полей. Вы также сохраняете intellisense, чего нельзя делать при сериализации.

public class ViewModel {
    public string user_name {get;set;}
    public date date_updated {get;
    public string firstName {get;set;}
}

public interface IUserAndDate {
    string user_name {get;set;}
    date date_updated {get;set;}    
}

public interface IFirstName{
    string firstName {get;set;}
}

Ваши методы могут затем получить IFirstname или IUserAndDate в зависимости от ситуации, и они будут преобразованы как таковые.

public void myhelper(IUserAndDate userandDate) {
   ....
}

someObject.myhelper(viewModel);

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

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

0 голосов
/ 15 сентября 2018

Вы можете использовать JObject Class из Newtonsoft.Json.Linq, чтобы избавиться от многих моделей.

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