Вопрос дизайна о веб-сервисах и WCF
У меня есть метод обслуживания с парой параметров, которые будут предоставлены всегда, и дополнительные параметры, которые будут меняться по именам и количеству параметров (я буду знать, какие параметры ожидать в поле ACTION)
Для решения проблемы проектирования, подобной описанной выше, я создал веб-сервис с параметрами, которые будут предоставляться всегда, и еще одним параметром, который будет принимать строку, записанную в виде значения ключа<*>.
используя MyServiceMethod:
Action : Action1
Param2: Hello
param3: world
Additional_Params: name<*>Jack;address<*>2 street;
(Я знаю, что с помощью Action1 я получаю значения имени и адреса от человека, который использует сервис)
используя MyServiceMethod во второй раз:
Action : Action5
Param2: Hello
param3: world
Additional_Params: numOfHours<*>3;Sum<*>342;myName<*>asaf;
Я думаю, что это не лучший дизайн для веб-службы, которая принимает разные данные для каждого ДЕЙСТВИЯ. Есть ли лучший способ сделать это?
3 ответа
Я вроде уже ответил в комментариях, но здесь это в одном месте:
Если у вас небольшое количество различных функций, которые редко меняются, лучший способ - это просто представить каждую из них как отдельную функцию. Когда нужны новые, вы можете расширить свой интерфейс, не нарушая существующий код.
Теперь, с другой стороны, если бы у вас было большее количество функций и / или они часто менялись, тогда простой, но гибкий интерфейс был бы лучше. Вы можете открыть одну функцию, взяв XML-документ, который является сериализацией запроса DTO. Для этого потребуется некоторая логика демультиплексирования (переключатель / регистр или, что лучше, таблица поиска делегатов) для отправки запросов обработчику. Этот подход труднее реализовать, но легче поддерживать.
Если у вас небольшой набор действий, вероятно, будет лучшей стратегией проектирования просто использовать один метод для каждого действия. Вероятно, не потребуется так много работы, чтобы разобраться на заднем плане, и, на мой взгляд, в этом нет ничего постыдного.
Если у вас большой набор действий, вы можете представить, что вы хотите сделать, в виде структуры данных и передать только этот параметр.
В любом случае, я бы не сказал, что то, как вы предлагаете это сделать, неверно, но на самом деле это может привести к тому, что вы создадите для вас больше работы и позже запутаетесь с вами или другим разработчиком.
Я не на 100% понимаю, что вы пытаетесь сделать, но если вы знаете, что Action1
всегда будет вызываться с парами имя / значение "имя" и "адрес", и Action5
будет вызываться с "numOfHours", "Sum" и "myName", тогда я согласен с ответом @Eugarps и комментарием @Steven_Sudit. Просто выставьте их как параметры метода для каждого действия.
Однако, если вы не знаете, какими будут переменные параметры (только то, что вы получите определенные пары имя / значение при вызове действий), то я бы по крайней мере использовал IDictionary<string, object>
а не строка. Выполнение этого означает, что вы можете избежать разбора строковых значений. Если передаваемые значения являются экземплярами ваших собственных типов (а не примитивов), то вам также необходимо использовать ServiceKnownType
атрибут рассказать о них сериализатору.