ASP. NET Базовый API связывает несколько типов объектов из тела - PullRequest
0 голосов
/ 24 апреля 2020

Я использую .net core sdk v3.0.101

Сценарий

Входящий запрос POST будет содержать коллекцию типов объектов в своем теле, используя следующую структуру:

{
    "object-collection": [{
            "type": "ClassA",
            "properties": [
                "name": "First object type",
                "code": "CODE_1"
            ]
        },
        {
            "type": "ClassB",
            "properties": [
                "name": "Second object type",
                "tag": "TAG_1",
                "is-valid": "true"
            ]
        }
    ]
}

Важным моментом здесь является то, что на практике в полезную нагрузку запроса может быть включено около 100 типов.

У меня есть модели, определенные для каждой type, указанной в запросе. выше они выглядят так:

public class ClassA
{
  [Required]
  public string Name { get; set; }

  public string Code { get; set; }
}

public class ClassB
{
  [Required]
  public string Name { get; set; }

  [MaxLength(255)]
  public string Tag { get; set; }

  public bool IsValid { get; set; }
}

Цель

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

То, что я пробовал

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

Я думал только о привязке к очень простой модели. примерно так:

public class PayloadModel
{
  [Required]
  public string ObjectCollection { get; set; }
}

Тогда циклически просматривая данные JSON, чтобы найти класс по значению атрибута type, а затем связывается с новым экземпляром класса.

public async Task<IActionResult> CreateObjectCollection([FromBody]PayloadModel objectCollection)
{
    // Send a command off to deserialize the JSON string into the various objects

    // Do other stuff
}

Вопросы

  1. Можно ли использовать привязку пользовательской модели для достижения того, что я описал?
  2. Если нет, есть ли более чистый способ сделать это, который я не рассмотрел?

Заранее спасибо - дайте мне знать, если я могу предоставить больше информации

1 Ответ

0 голосов
/ 24 апреля 2020

Я бы просто разделил эти элементы на отдельные коллекции, чтобы вам не приходилось сталкиваться с проблемами преобразования типов:

public class PayloadModel
{
  public List<ClassA> ClassACollection { get; set; }
  public List<ClassB> ClassBCollection { get; set; }
}

var payload={
    "object-collection": [
        {
            "type": "ClassA",
            "properties": {
                "name": "First object type",
                "code": "CODE_1"
            }
        },
        {
            "type": "ClassB",
            "properties": {
                "name": "Second object type",
                "tag": "TAG_1",
                "is-valid": "true"
            }
        }
    ]
};

var mappedPayload=payload["object-collection"].reduce((combined,item)=>{
   if(!combined[item.type+"Collection"]) combined[item.type+"Collection"]=[];
   
   combined[item.type+"Collection"].push(item.properties);
   return combined;
},{});

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