Модель связывает подмножество свойств класса - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь связать только подмножество свойств класса из тела запроса API, я не уверен, как этого добиться. Если бы я мог связываться с базовым классом только с теми свойствами, которые я хочу принять в качестве входных данных, тогда приведу его к дочернему классу с дополнительными свойствами, что решило бы мою проблему, но без сериализации / десериализации это не вариант (т.е. не может быть приведен из база для ребенка). Пример класса, я хочу разрешить привязку имени только из [FromBody]

public class project {
     public string id { get; set; }
     public string name { get; set; }
}

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

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

ИМХО вам следует создать новый DTO для модели, которую вы хотите связать, применяя Принцип единой ответственности , а также лучше для целей обслуживания.Если вы начнете наследовать от базового класса, позже вы столкнетесь с огромной проблемой, если вам нужно будет изменить контракт этого класса, например, удалить ненужные свойства, которые могут повлиять на ваши подклассы.

Теперь вы можете создать

class ProjectWithOnlyName
{
    public string name{get;set;}
}

и передать этот экземпляр в качестве параметра вашего контроллера

public void MyControllerMethod([FromBody] ProjectWithOnlyName dto)
{
    ....
}

Я бы предложил DTO для каждого выполняемого вами действия.

Для обновления

class ProjectWithOnlyNameForUpdateDto
{
    public string name{get;set;}
}

[HttpPut]
public void CreateMethod([FromBody] ProjectWithOnlyNameForUpdateDto dto)
{
    ....
}

Для создания

class ProjectWithOnlyNameForCreateDto
{
    public string name{get;set;}
}

[HttpPost]
public void CreateMethod([FromBody] ProjectWithOnlyNameForCreateDto dto)
{
    ....
}

Надеюсь, это поможет

0 голосов
/ 16 апреля 2019

Вы можете использовать преобразователь типа, как описано здесь

...