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

10

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

Ваш Ответ

1   ответ
27

методы с именем 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 требуют более высоких стандартов кодирования, особенно в интерфейсе, доступном конечному потребителю.

+1 за упоминание объекта сообщения. slugster

Похожие вопросы