我正在寻找除了通常的“输出参数令人困惑并表明该方法正在做不止一件事”式参数之外的原因,以及更多关于 WCF 服务中的输出参数特别不好的原因。我现在工作的地方,我们在 WCF 服务中有一条针对它们的规则,我正在尝试找出原因!
2 回答
就个人而言,我在特定的地方使用 out 参数(例如名为 TryParse() 的方法)。所以,我有一些你谈到的偏见,我只在特定的、有限的地方使用它。此外,您不能假设 .Net 应用程序将在另一端使用它。因为 WCF 提供了一个可用作 SOAP 或 REST Web 服务(以及其他通信类型)的接口,所以我不能保证 WCF 甚至会支持与非 .Net 使用者兼容的参数。
除此之外,WCF 服务正在向消费者提供 API,并且 API 应该提供一个接口,该接口应该在对服务器方法如何编码的了解有限的情况下使用。(不要假设编写 WCF 服务器的人与在另一端编写客户端的人是同一个人)。尝试在 API 上使用 out 参数似乎是代码异味。据推测,人们会使用 out 参数将另一个值返回给消费者。考虑改为使用消息对象。消息对象具体由需要从 WCF 服务器发送到其使用者的所有数据片段组成。例如,假设您在 WCF 服务器中公开了一个名为 TryCreateUser 的方法:
bool TryCreateUser(string name, string email, out User user){}
您打算在哪里返回一个布尔值,指示用户创建成功的位置,如果成功,则返回一个包含用户的用户对象。我将创建一个新类 UserCreationMessage:
class UserCreationMessage {
bool IsSuccessful;
User user;
}
将此消息对象返回给消费者,仍然可以获得多个返回值。但是,您现在返回了一个连贯的对象,这对 API 的最终用户来说更具解释性。
最后,我认为在 API(例如 WCF 服务器)中有 out 参数是不好的做法,因为为该服务创建使用者的程序员必须能够轻松查看 API 并使用它而无需跳过out 参数存在的箍。由于存在更好的设计,请使用它。API 需要更高的编码标准,尤其是在暴露给最终消费者的接口中。
一个原因是out
参数由添加服务引用时生成的代理类处理 - 这是额外的开销。
另一个原因:根据这篇文章,即使原始out
参数在您使用它时是最后一个,它也会成为第一个 - 混淆并可能导致复杂错误,可能需要一些时间才能解决,直到有人弄清楚这一点。
个人观点:WCF操作(方法)应该做点什么,返回点什么。它可能会做很多事情,但只返回一件事,即结果 - 如果您需要额外的东西,只需让它返回复杂类型,其中包含您需要的所有内容作为该类型的数据字段。