Динамический параметр для .Метод Net core controller

#c# #api #asp.net-core

#c# #API #asp.net-core

Вопрос:

У меня есть вызов объекта класса CustomerBase.cs с определенными свойствами. Он действует как базовый класс для двух других моих классов: Customer.cs и Vendor.cs. i.e

 public class Customer: CustomerBase
public class Vendor: CustomerBase
  

У меня есть метод контроллера следующим образом:

  [HttpPost("CustomerData")]
 public async Task<CustomerBase> CustomerDataAsync(CustomerBase customerBaseParam)
 { }
  

Когда этот контроллер api вызывается другим веб-пользователем, параметр тела Json будет содержать $Type объекта rootobject. Он может содержать поставщика или клиента или просто базу клиентов. На данный момент, даже когда я передаю объект Vendor в качестве параметра, он сохраняет только свойства CustomerBase для параметра customerBaseParam. То же самое с объектом Customer, отправленным в качестве параметра. Как я могу изменить тип customerBaseParam на основе вводимого параметра тела Json.?

Я использую Newtonsoft.

Комментарии:

1. Ответ будет другим, если вы используете Newtonsoft. Json или System.Text.Json. Вам необходимо указать

2. Я использую Newtonsoft.Json

Ответ №1:

Вместо того, чтобы позволить MVC анализировать результат JSON за вас, возьмите JObject и найдите поле, которое определяет, с каким типом объекта JSON вы имеете дело. Это позволит вам решить, к какому типу его отнести.

Примечание: Вы можете спроектировать это отдельно от промежуточного программного обеспечения MVC, чтобы оно было абстрагировано.

 [HttpPost("CustomerData")]
public async Task<CustomerBase> CustomerDataAsync(JObject customerBaseJson)
{
    var customerBaseIdentifier = customerBaseJson["fieldNameWithinTheJsonPayload"];

    //This should really be a strategy pattern to adhere to the SOLID open close principle.
    switch(customerBaseIdentifier) {
        case "type 1":
            var type1Object = JsonConvert.Deserialize<Type1>(customerBaseJson);
            break;
        case ...
    }
}