WCF RESTful-сервисы, использующие интерфейс с обобщениями - PullRequest
2 голосов
/ 15 февраля 2010

У меня есть интерфейс, подобный этому:

[ServiceContract]
public interface IBaseService<T>
{
    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<T> LoadById(string value);

    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<T> Load(string field, string value);
}

Эти методы будут реализованы в нескольких сервисах. Пример реализации будет выглядеть так:

[ServiceContract]
[ServiceKnownType(typeof(ObjectDTO))]
public interface IObjectService : IBaseService<ObjectDTO>
{
}

У меня вопрос: возможно ли настроить службы RESTful, используя эту архитектуру, используя UriTemplates в OperationContracts в интерфейсе базовой службы? Я пытался искать, но не видел, чтобы кто-то еще пытался настроить свои службы RESTful таким образом.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2010

Это сугубо мой HO, но я настоятельно рекомендую вам попробовать OpenRasta вместо поддержки REST на основе RPC на основе RPG в WCF. Это, безусловно, возможно в OpenRasta.

1 голос
/ 15 февраля 2010

Учитывая способ использования сервисов REST, я не уверен, что есть смысл использовать дженерики. Вы теряете все преимущества строгой типизации при переключении на динамический транспорт.

Сериализация JSON является динамической и не учитывает тип, поэтому зачем вам строго печатать вывод?

[ServiceContract]
public interface IBaseService
{
    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<object> LoadById(string value);

    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<object> Load(string field, string value);
}

Будет выдавать тот же вывод JSON.

Учитывая, что я считаю, что вам лучше всего не использовать дженерики в REST.

1 голос
/ 15 февраля 2010

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

Если вы хотите легко создавать веб-сервисы без конфигурации, вам следует проверить servicestack.net . Это платформа веб-службы с открытым исходным кодом, которая позволяет создавать веб-службы JSON и XML с полным REST без какой-либо конфигурации конечной точки, контрактов на обслуживание или эксплуатацию - используя только POCO DataContracts. Вот живой пример , показывающий код клиента и сервера, необходимый для создания простых веб-служб REST, вызываемых клиентами Ajax и Silverlight:

0 голосов
/ 20 апреля 2010

WCF не разрешает открывать дженерики в контрактах на обслуживание. Он предоставляет атрибуты KnownType и ServiceKnownType, которые позволяют вам «информировать» его о ваших полиморфизмах. Вы можете предоставить статический вспомогательный метод атрибуту ServiceKnownType, который также возвращает коллекцию известных типов. Я использовал это, чтобы вернуть типы, которые соответствуют моей общей конфигурации.

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