Аргументы 'by ref' в WCF - это плохо или хорошо?

Недавно я видел, как служба WCF объявляет контракты спо ссылке аргументы.

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

Как вы думаете?

Ответы на вопрос(3)

Вы должны быть очень осторожны.

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

Как уже объяснил mars_s, wcf является средой обмена сообщениями. Его природа заключается в отправке и получении независимых сообщений.

Я думаю, что хорошей практикой является всегда определять входящее / исходящее сообщение. Ваш sericve-интерфейс будет легче понять и поддерживать.

методы с параметрами ref и out всегда имеют тенденцию быть очень уродливыми и трудными для понимания.

согласно этой статье Microsoft, вызов WCF ведет себя точно так же, как удаленный вызов процедуры, и аргументы ByRef могут использоваться для возврата данных:

http://msdn.microsoft.com/en-us/library/ms733070.aspx

Обратитесь к разделу: Параметры Out и Ref.

В большинстве случаев вы можете использовать параметры (ByVal в Visual Basic) и параметры out и ref (ByRef в Visual Basic). Поскольку параметры out и ref указывают, что данные возвращаются из операции, подпись операции, такая как следующая, указывает, что операция запрос / ответ требуется, даже если подпись операции возвращает void.

не метод "вызова удаленного объекта" или что-то еще - это чистая передача сообщений. Таким образом, параметр "by-ref" может компилироваться, но на самом деле он не будет делать ничего полезного.

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

Затем сервер десериализует сообщения обратно в набор параметров, и компонент диспетчера на сервере затем создает экземпляр класса обслуживания и вызывает соответствующий метод в этом экземпляре класса обслуживания с параметрами из сообщения.

Вся история работает в обратном направлении для ответа, отправляемого сервером обратно.

Но опять же: все, что вы обмениваетесь между клиентом и сервером, этосериализованное сообщение - нет абсолютно никакого смысла делать параметр «по ссылке» - в конце концов, он не может быть параметром по ссылке. Сервер и клиент - это совершенно разные миры, совершенно разные объекты и классы - они просто выглядят одинаково на проводе.

Поэтому я думаю, что тот, кто написал этот метод WCF, не понимал принципы передачи сообщений WCF, но был привлечен тем, что чувствует WCF - как просто вызов метода. Но на самом деле это не просто вызов метода в конце.

 MatteoSp24 дек. 2009 г., 15:18
Это именно то, о чем я думал. И после вашего ответа я решил запустить тест. Звучит странно, но инфраструктура WCF обрабатывает by ref: если служба вносит изменения в аргумент by ref, после того, как вызов возвращается клиенту, переданный аргумент отражает эти изменения.
 marc_s24 дек. 2009 г., 23:14
@MatteoSp: это очень интересно слышать! Я даже не удосужился попробовать, так как из всего, что я знал, я был уверен, что это никогда не сработает - лучше попробуй сам! :-) Тем не менее, возникает вопрос, если это действительно хорошая идея, хотя ....
 thewpfguy20 мар. 2013 г., 08:54
@marc_s Немного поздно, но WCF по умолчанию выполнен в стиле RPC. В конце концов мы вызываем метод для объекта (прокси) и по волшебству метод работает на сервере. Чтобы использовать стиль «обмена сообщениями», нам нужно использовать контракты Message, которые дают нам полный контроль над SOAP-сообщением.

Ваш ответ на вопрос