Разработка клиента/оболочки C# SOAP API

Предыстория
Я взаимодействую с веб-службой SOAP, используя C#. Я работаю в Visual Studio и успешно настроил ссылку на службу и могу использовать веб-службу в своем коде.

Мои вопросы связаны с тем, «как лучше всего» разработать клиент/оболочку для API, учитывая мощные функции C # как языка.

Центральный класс "Запрос"
Я подумал о создании общего класса для обработки запросов к службе и, таким образом, обработки всех различных перестановок конкретных ошибок API (их много), и деградировать изящно. Этот класс также может быть «контроллером» для клиента API, который также обеспечивает общий интерфейс между внутренними вызовами и внешним миром/кодом.

Затем я заметил огромное разнообразие типов данных, которые требуются и могут возвращаться каждым вызовом API. Несомненно, это означает, что эта функциональность «запроса» не может обрабатываться в общем виде (и должна быть реализована в каждом конкретном типе запроса — например, аутентификации, положении транспортных средств, заданиях/заказах)?

А если может, то как C# как язык может помочь мне в абстрактной работе с типами?

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


person George    schedule 10.02.2013    source источник
comment
Два голоса, чтобы закрыть? Серьезно? Может ли кто-нибудь обосновать, почему этого недостаточно для переполнения стека?   -  person George    schedule 10.02.2013
comment
Вы спрашиваете, если вы слишком усложняете, ну, вопрос слишком сложный. Очень сложно найти четкий ответ на вопрос.   -  person Petter Nordlander    schedule 10.02.2013
comment
Хм, просто изо всех сил пытаюсь найти золотую середину между предоставлением недостаточной справочной информации и предоставлением слишком большого количества. Вопрос по сути - как лучше сделать вышеописанное, учитывая языковые особенности C#.   -  person George    schedule 10.02.2013
comment
ОК - вопрос существенно отредактирован. Надеюсь, это лучше :)   -  person George    schedule 10.02.2013


Ответы (1)


Вопрос немного расплывчатый в деталях, но я постараюсь дать несколько советов.

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

Представьте, что у нас есть сторонний API электронной почты, и мы хотим создать для него оболочку.

Я бы начал с создания оболочки, которая ведет себя так, как я ожидал бы от API электронной почты. Должны быть такие методы:


public EmailResponse SendEmail(EmailRequest request) { }
public User GetUser(string email) { }
public void OptOut(string email) { }

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

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

На мой взгляд, обертки бесполезны, если вы слишком тесно связываете их с конкретной реализацией.

C# имеет множество языковых функций, которые делают возможным такой подход, но я думаю, что использование простого интерфейса будет соответствовать вашим потребностям. Не нужно делать его сложнее, чем он есть.

person ryan1234    schedule 10.02.2013
comment
Спасибо за ваш ответ и извините за поздний ответ. На самом деле это иронично, так как мне пришлось отредактировать вопрос, так как он был слишком многословным! Основная проблема, с которой я сейчас сталкиваюсь, — это проблема абстракции/дизайна. Мне нужно будет проверять каждый запрос к API, например, для проверки существующего сеанса аутентификации. Это означает, что мне понадобится метод центрального обработчика, из которого будут происходить все остальные. Хотя я не уверен, как это выполнимо на С#... - person George; 12.02.2013
comment
Посмотрите АОП. Это создает сквозные опасения. Раньше я использовал АОП с WCF. Это отлично подходит для кэширования/регистрации/аутентификации, но приводит к некоторым накладным расходам. stackoverflow.com/questions/1416880/ - person ryan1234; 12.02.2013