2012-05-03 1 views
-1

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

[OperationContract] 
Student PostStudent (Student student); 

Хороша.

И этот метод плох:

[OperationContract] 
void PostStudent (string firstname, string lastname etc..); 

Но моя реализована версия такова:

[OperationContract] 
void PostStudent(Student student); 

Так я не уверена, если моя реализована версия плоха, Im также знает, как мой преподаватель получил

Student PostStudent (Student student); //?

+3

Можете ли вы рассказать о том, что вы подразумеваете под «этот метод плохой»? – mgnoonan

+0

Я могу видеть, что метод «плохой» имеет избыточное количество параметров метода (сколько вы оставили в '...').Вы также можете поддразнивать, что он не использует оболочку верблюда для имен параметров, но в противном случае нет ничего плохого в этом. –

+0

Мое предпочтение в отношении того, что ваш лектор описывает как «хорошую» реализацию, также основано на том, что тип ввода - это «Студент», а не пучок строк. Это должно приводить к путанице в отношении значения каждого параметра менее вероятным. Но это также предотвращает URL-сопоставление параметров в стиле REST, если вы решите это сделать позже. – faester

ответ

3

Веб-службы основаны на использовании сообщений. Сообщение в WCF определяется путем написания класса, который принадлежит вашему классу Student, и (optionally), обозначая его атрибутом DataContract. Это позволяет управлять версиями и устанавливать различные свойства на properties этого класса (хотя последний эффект также может быть достигнут с использованием атрибута MessageParameter).

Да, PostStudent (string firstname, string lastname etc..) Плохо.

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

Если вы хотите inpect созданного студента, вы можете также определить PostStudentResult (или PostResult<T>) класса и вернуться, что, содержащее свойство Student (или T Result) и Status, где первый содержит студент, как он создан и последний указывает, было ли создание успешным.

+2

+1 Для меня главное отличие в «хорошей» версии, это скорее будущее доказательство ... он имеет дело с версией гораздо лучше. http://msdn.microsoft.com/en-us/library/ms731060.aspx –

0

Возвратные значения в веб-сервисах - это не плохая практика в целом. Это касается параметров. Данные, которые принадлежат вместе, должны быть завернуты в объекты.

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

Если нужно получить какой-то студент, вы должны создать метод, как:

Student GetStudentByName(string name); 
0

Если это WCF, то с указанием действий также может быть хорошей практикой с Пустоты методами.

0

Как и у evryone else, слишком много параметров метода - это плохая практика. В любом случае я вижу только одну разницу между вашей подписью и хорошей подписью, которую вы упомянули. Наличие объекта-ученика в качестве возврата даст вам возможность иметь идентификатор студента после добавления в db, например. То же самое относится к любым другим расчетным свойствам объекта. Метод void заставит вас снова загрузить объект, что означает дополнительную поездку на сервер, если вы захотите использовать объект непосредственно после его публикации. Любой способ иметь метод void WCF не является плохим, если возвращение объекта - это не что иное, как дополнительная полоса пропускания.