2017-02-17 3 views
1

Я надеюсь, что этот вопрос задан раньше, и я просто не нахожу его. Я пишу набор Restful API в WebAPI2. Я понимаю, что API-контроллеры будут возвращать модели в ответ. Мой вопрос: могу ли я создавать динамические свойства в этих моделях, когда нужны дополнительные данные?WebApi2 - Как добавить динамические свойства к модели

Например, я могу иметь класс, который выглядит следующим образом:

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 без всех баров (иначе он отправит много данных, которые не будут использоваться).

Это имеет смысл?

Любые идеи были бы весьма признательны.

Ben

+0

Я бы создал новые классы для возвращения таких, как DTO – miechooy

+0

Один вопрос за сообщение, пожалуйста. –

ответ

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.

Смежные вопросы