Полиморфизм для типа возврата в do tnet REST API - PullRequest
1 голос
/ 08 мая 2020

В контексте do tnet core REST api, я хочу возвращать «облегченную» версию объектов при их перечислении, чтобы избежать большого количества ненужных данных. Я пытаюсь использовать для этого полиморфизм:

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
}
public class Student : Person
{
  public int Age { get; set; }
}

[HttpGet("testList")]
public List<Person> getPersons()
{
  List<Person> testList = new List<Person>();
  testList.Add(new Student() { FirstName = "Kevin", LastName = "Smith", Age = 99 });
  return testList;
}

[HttpGet("test")]
public Student getStudent()
{
  return new Student() { FirstName = "Kevin", LastName = "Smith", Age = 99 };
}

Когда я звоню /testList, я получаю следующее json:

[
  {
    "age": 99,
    "firstName": "Kevin",
    "lastName": "Smith"
  }
]

Я ожидал, что return не содержит age параметр из-за типа возвращаемого значения, но это не так. Есть ли способ получить «облегченную версию» только для метода листинга?

Спасибо,

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я рекомендую использовать объекты передачи данных (DTO), чтобы возвращать только ту информацию, которую вы хотите. Используйте это так:

[HttpGet("testList")]
public List<PersonDto> getPersons()
{
  List<Person> testList = new List<Person>(); // ... fetch records from data source

  return testList.Select(e => new PersonDto() { // PersonDto contains only props you need
    FirstName = e.FirstName,
    LastName = e.LastName
  });
}

0 голосов
/ 08 мая 2020

Когда мы используем наследование, мы должны помнить, что дочерний объект может быть заменен родительским объектом, и вы сделали то же самое здесь, и когда он становится json, рассматривается реальный тип объектов, а не их абстрактный тип. Вы можете вернуть родительский объект следующим образом:

public static List<Person> getPersons()
{
  List<Person> testList = new List<Person>();
  testList.Add(new Student() { FirstName = "Kevin", LastName = "Smith", Age = 99 });
  return testList.Select(e=> new Person() {FirstName=e.FirstName,LastName=e.LastName}).ToList();
}

И я думаю, что хорошая идея - использовать Dto, как упоминал выше наш друг @TWP.

...