ServiceStack и динамические свойства в запросах DTOs


Я хотел бы разместить объект JSON в моем сервисе стека служб и использовать динамическое свойство в запросе DTO. Все подходы, которые я пробовал до сих пор, оставляют объект с нулевым значением.

Код javascript, который я использую:

$.getJSON(
  "/api/json/reply/Hello",
  {
    Name: "Murphy",
    Laws: {
      SomeProp: "A list of my laws",
      SomeArr: [
        { Title: "First law" },
        { Title: "Second law" },
        { Title: "Third law" }
      ]
    }   
},
function(data) {
    alert(data.result);
  }
);

DTO для получения запроса:

public class Hello
{
    public string Name { get; set; }
    public dynamic Laws { get; set; }
}

Я также попытался использовать объект и JsonObject вместо dynamic в DTO.

Чтобы быть полным, вот сервис тоже:

public class HelloService : Service
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

Мерфи проходит через свойство Name без каких-либо проблемы, но свойство законов остается нулевым.

В конце концов, я хочу как-то повторить (используя отражение?) над свойством законов и получить все содержащиеся свойства и значения.

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

Спасибо за любую помощь!

1 4

1 ответ:

На .Net 3.5 с библиотека построения ServiceStack на NuGet не имеет встроенной поддержки .Net версии 4.0+ динамической тип. Вы можете передать JSON в СВОЙСТВОstring и динамически проанализировать его на сервере:

public object Any(Hello request)
{
    var laws = JsonObject.Parse(request.Laws);
    laws["SomeProp"] //
    laws.ArrayObjects("SomeArr") //
}

В противном случае вы можете использовать Dictionary<string,string> или указать в вашем AppHost:

JsConfig.ConvertObjectTypesIntoStringDictionary = true;

Можно использовать object, который будет обрабатывать объекты как словарь строк.

В противном случае dynamic не должен быть на DTO, поскольку это бессмысленно относительно того, что ожидает служба. Вы можете просто добавить его в строку запроса. Вы можете использовать формат JSV для указания сложных графов объектов в строке запроса, например:

/hello?laws={SomeProp:A list of my laws,SomeArr:[{Title:First Law}]}
Примечание: пробелы выше кодируются с помощью %20 на проводе.

К которым вы можете получить доступ в ваших сервисах с помощью:

public object Any(Hello request)
{
    var laws = base.QueryString["laws"].FromJsv<SomeTypeMatchingJsvSent>();
}