Предоставить дополнительную информацию с некоторыми конкретными элементами в списке - PullRequest
0 голосов
/ 29 января 2019

Допустим, у меня есть класс, который содержит свойство, как показано ниже:

List ListOfObjectA;

Объект A определен ниже:

Class ObjectA:
Prop a
Prop b

ListOfObjectA (возвращаетсяконечная точка API (DTO) должна отображаться в пользовательском интерфейсе.

В некоторых случаях конкретный экземпляр ObjectA в списке должен предоставлять дополнительную вспомогательную информацию (скажем, другой объект SubObjectA (сложный тип), который не являетсяне является общим для других элементов в списке) Т.е. n + 1 случай.

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

Oneопция заключается в том, чтобы включить SubObjectx в сам класс ObjectA - когда он нулевой или пустой, не беспокойтесь о его визуализации.Мы бы заполнили его программно там, где это необходимо ...

Второй вариант - возможно, добавить свойство url в класс ObjectA - url может быть либо пустым, либо указывать на конечную точку, чтобы получить дополнительную информацию и получить ответ, после чегоrendered.

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

Мне интересно, есть ли другие лучшие способы сделать это?

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы можете использовать List<anonymous_objects>.

    var DTO = new List
    {  
       new {City = "Chicago", Code = "114"},
       new {City="Washington"},
       new {City="London", Code = "2"}
   }

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

 var city = DTO[0].GetType().GetProperty(nameof(DTO[0].City)).GetValue(DTO[0]);

Кроме того, я полагаю (я не сделалпроверьте) вы можете использовать List<dynamic>.Все равно, но вы бы написали new List<dynamic>, и вам не нужно было бы использовать GetType и все такое.Просто напишите DTO[0].City.Попробуйте это:)

0 голосов
/ 29 января 2019

Независимо от того, выполняете ли вы автоматическое связывание модели JSON из тела запроса или вручную используете что-то вроде JsonConvert для создания моделей, у вашего класса (ов) DTO должны быть все возможные свойства.Нет реального способа создания экземпляров различных типов объектов из одного и того же набора данных, основанного на наличии или отсутствии какого-либо конкретного элемента данных.Тем не менее, вы можете создать пользовательский механизм связывания моделей и несколько пользовательских преобразователей JSON, чтобы потенциально выполнить работу, но объем работ, связанных с чем-то, что в основном косметическим, не стоит вложенных средств.это только проблема для самих классов DTO.В JSON.NET можно использовать такие вещи, как атрибут JsonIgnore и перечисления NullValueHandling и DefaultValueHandling, чтобы скрыть элементы в реальном JSON, если это ваша основная задача.Например:

public class ObjectA:
{
    public string A { get; set; }
    public string B { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string C { get; set; }
}

Затем, когда вы сериализуете свои объекты, если свойство C не установлено, вы получите JSON, например:

{
    "a" : "foo",
    "b" : "bar"
}

И еслиэто установлено, вы получите:

{
    "a" : "foo",
    "b" : "bar",
    "c" : "baz"
}

Если не считать этого, я бы сказал, что ваш лучший выбор - ссылки для запроса дополнительных данных в случае необходимости.Это на самом деле очень ОТЛИЧНАЯ вещь.По сути это HATEOAS .Тем не менее, это также очень болтливый .Это потребует гораздо большего количества запросов, особенно если вам придется сделать это для нескольких элементов.По сути, это проблема запросов к базе данных N + 1, применяемая к API.

...