Это плохая практика иметь выходной параметр в методе в службе WCF?

Я ищу причины, выходящие за рамки обычного "выходящие параметры сбивают с толку и указывают на то, что метод выполняет более чем одну вещь" в стиле аргументов и больше о том, что конкретно плохо в выходных параметрах в сервисах WCF. Там, где я сейчас работаю, у нас есть правило против них в службах WCF, и я пытаюсь понять, почему!

2 ответа

Решение

Лично я использую параметры в определенных местах (например, методы с именем TryParse()). Итак, у меня есть некоторые предубеждения, о которых вы говорили, когда я использую их только в определенных ограниченных местах. Кроме того, вы не можете предполагать, что приложение.Net будет использовать это на другом конце. Поскольку WCF предоставляет интерфейс, потребляемый в виде веб-службы SOAP или REST (среди других типов связи), я не могу гарантировать, что WCF будет даже поддерживать параметры для совместимости с потребителями, не входящими в.Net.

Кроме того, служба WCF предоставляет API потребителю, и API должны предоставлять интерфейс, который должен использоваться с ограниченными знаниями о том, как кодировались методы сервера. (Не думайте, что тот, кто пишет сервер WCF, - это тот же парень, который пишет клиент на другом конце). Попытка использовать out-параметр в API выглядит как запах кода. Предположительно, можно использовать параметр out, чтобы вернуть другое значение (я) потребителю. Попробуйте вместо этого использовать объект сообщения. Объект сообщения специально составлен из всех фрагментов данных, которые должны быть отправлены с сервера WCF его потребителю. Например, предположим, у вас есть метод, представленный на сервере WCF, который называется TryCreateUser:

bool TryCreateUser(string name, string email, out User user){}

где вы намереваетесь вернуть bool, указывающий, где создание пользователя прошло успешно, и объект User, содержащий пользователя, если это удалось. Я хотел бы создать новый класс, UserCreationMessage:

class UserCreationMessage {
    bool IsSuccessful;
    User user;
}

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

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

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

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

Личное мнение: операция (метод) WCF должна что-то делать и что-то возвращать. Он может делать много вещей, но возвращать только одну вещь, которая является результатом - если вам нужны дополнительные вещи, просто верните сложный тип со всем необходимым в качестве полей данных этого типа.

Другие вопросы по тегам