Получение специфичного для типа ответа от общего запроса REST WCF? - PullRequest
1 голос
/ 03 февраля 2011

Я разрабатываю службу WCF REST.Требование к дизайну заключается в том, что клиент не знает подробностей данного запроса.Например, следующий запрос:

https://www.domain.com/dashboard/group/id/0

Вернется:

Request: GetGroup(GroupId = 0)
Response: 
{
Title="Country",
children = 
{
title="USA", Id=1, type=GROUP},
{title="England", Id=2, type=GROUP}
}
}

И следующий запрос:

https://www.domain.com/dashboard/group/id/3

Вернет:

Request: GetGroup(groupId = 3)
Response: 
{
Title="Customers",
children = 
{
title="General Motors", Id=1, type=CUSTOMER},
{title="General Electric", Id=2, type=CUSTOMER}
}
}

МОЙ ВОПРОС как мне взять общий запрос REST и вернуть ответ для конкретного типа?

В моем проектеЕсть несколько типов, которые будут сериализованы в ответе JSON.Сериализованный объект зависит от переданного параметра groupId.Вот они:

GROUP
CUSTOMER
FACILITY
TANK

В соответствующем посте было предложено создать базовый класс, который предоставляет GetGroupById, а вышеприведенные классы должны переопределить метод базового класса.Если это звучит как хороший пример того, как атаковать эту проблему, я был бы признателен за пример.Или, альтернативно, другие предложения.

Заранее спасибо.

1 Ответ

1 голос
/ 03 февраля 2011

Вы всегда можете создать службу, которая возвращает поток, и использовать JsonSerializer для сериализации ваших объектов в MemoryStream, а затем вернуть MemoryStream из службы:

public Stream GetSomeObject(int groupId)
{
    byte[] bytes;
    var serializer = new JavaScriptSerializer();

    switch(groupId)
    {
        case 2:
            var groups = GetGroups(); // fill the groups however
            bytes = Encoding.UTF8.GetBytes(serializer.Serialize(groups));
            break;
        case 3:
            var customers = GetCustomers();
            bytes = Encoding.UTF8.GetBytes(serializer.Serialize(customers));
            break;
    }

    return new MemoryStream(bytes);
}

В этом случае вы просто загрузите соответствующий объект в память на основе параметров и вернете соответствующий строго типизированный объект через Stream.

Это тот же подход, который я использовал в прошлом, чтобы возвращать результаты Json из службы WCF без информации о типе (подход был предложен командой WCF, входящей в состав Microsoft, поэтому я подумал, что это довольно надежно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...