WebApi2 - Как добавить динамические свойства в модель
Я надеюсь, что этот вопрос был задан ранее, и я просто не нахожу его. Я пишу набор Restful API в WebAPI2. Я понимаю, что контроллеры API будут возвращать модели в своем ответе. У меня вопрос, могу ли я создать динамические свойства в этих моделях, когда требуются дополнительные данные?
Например, у меня может быть класс, который выглядит так:
public class FooModel
{
public int FooId{get;set;}
public string Description{get;set;}
}
public class BarModel
{
public int BarId{get;set;}
public string Description{get;set;}
}
Я могу создать сервис, который будет извлекать только Foo, сохранять Foo и т. Д. Но что, если мне понадобится сервис, который будет возвращать Foo и все столбцы, связанные с этим Foo. Поэтому возвращаемый класс должен выглядеть следующим образом:
public class FooModel
{
public int FooId{get;set;}
public string Description{get;set;}
public List<BarModel> Bars{get;set;}
}
Нужно ли создавать для этого совершенно новую модель? Или есть способ в WebAPI, что я могу динамически добавить свойство Bars в FooModel.
В этом случае при сохранении Foo я бы не знал связанных с ним баров. Кроме того, для уменьшения пропускной способности в моем внешнем коде есть места, где мне нужно получить Foo без всех столбцов (в противном случае он будет отправлять много данных, которые не будут использоваться).
Имеет ли это смысл?
Любые идеи очень приветствуются.
Бен
1 ответ
Используйте DTO и используйте значения по умолчанию.
public class FooModel
{
[DefaultValue(0)]
public int FooId { get; set; } = 0;
[DefaultValue("")]
public string Description { get; set; } = "";
public List<BarModel> Bars { get; set; }
public bool ShouldSerializeBars() { return Bars != null && Bars.Any(); }
}
Если FooId = 0, то поле будет опущено. Это относится как к атрибутам, так и к элементам. Вам нужно будет добавить атрибут, но также и установить значение по умолчанию.
Вы также можете наследовать от других классов для расширения DTO.
public class FooModel2 : FooModel
{
[DefaultValue(0)]
public int FooId2 { get; set; } = 0;
}
В этом есть все поля FooModel и FooId2.