Использование динамического типа для получения сложных объектов в C # REST API - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий код

[HttpPost]
public void ImportUsers(dynamic parameters)
{
   ImportSourceCredentials importSourceCredentials = ((JObject)parameters.importSourceCredentials).ToObject<ImportSourceCredentials>();
   IEnumerable<string> externalIds = ((JArray)parameters.externalIds).ToObject<IEnumerable<string>>();
   ...
   ...
}

Есть ли здесь проблема в том, что два сложных объекта принимаются как динамический тип (в теле запроса) и десериализуются вручную?

Есть ли веские основания использовать объект DTO, чтобы воспользоваться преимуществами автоматического связывания?

1 Ответ

0 голосов
/ 11 октября 2018

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

  1. Из соображений безопасности.Пожалуйста, изучите JSON Injection.Раньше это было проблемой для некоторых маршаллеров.Tldr динамика облегчает удаленное выполнение кода. Вот пример с дополнительными значениями

Следующие два являются более общими, не совсем применимыми к вашей реализации.

Позже, когда проект будет расти, у вас будут проблемы с запоминанием того, какие данные принимает контроллер.Если он является частью микросервисной архитектуры, он будет нарушать чтение кода, так как у вас не будет никаких намеков на то, что может отправлять данные на него (что было бы возможно при использовании DTO для всего приложения, VS показывал бы вам ссылки)

Некоторые ошибки перемещаются во время выполнения, например, опечатка в некотором методе доступа к полям, которая будет обнаружена компилятором, если будет использоваться dto, что приведет к аварийному завершению приложения во время выполнения с динамическим типом.

Мой совет - максимально сократить использование динамического типа.C # статически типизирован, так зачем отказываться от него?

...