为什么要使用ChannelFactory来实例化WCF代理,而不是使用Service Reference?

7

似乎有两种实例化WCF服务代理的方法,描述在这里。我的问题是为什么要使用ChannelFactory来实例化WCF代理,以及采用这种方法的好处是什么?

我遇到过对第二个选项有强烈看法的人,但我无法理解他们的清晰论证。


3
请解释一下“第二个选项”是什么意思。创建 WCF 代理有不止两种选项。 - CodeCaster
我尝试了,但堆栈不允许我发布链接。 - Yurii Hohan
我很好奇这个链接现在是什么,因为一个拥有730声望值的用户应该完全可以发布链接。你能否通过bit.ly运行链接,以便我们可以查看它? - Marc Gravell
链接中有两个选项...请看第一句话。简而言之,使用服务引用或使用通道工厂。 - Jeremy McGee
@Jeremy,问题在于为什么有人想要使用ChannelFactory,我会编辑问题以使其更清晰。 - Yurii Hohan
当我们使用通道工厂时,是否会有性能方面的差异? - Thomas
3个回答

4
第一种选项使用 web.config / app.config 文件中提供的配置设置来实例化代理,但在某些情况下,在该文件中放置这些设置是不可行的。例如,如果您的应用程序需要根据场景使用不同的绑定(例如HTTP与命名管道),或者可能您的应用程序甚至没有.config文件。

第二种选项在创建代理时通过编程方式指定要使用的配置,从而提供了更多的灵活性。


为了给出更具体的示例,假设您希望在与本地机器通信时使用命名管道进行通信,而在与远程主机通信时使用HTTP:

if (UseNamedPipes())
{
    EndpointAddress address = new EndpointAddress("net.pipe://localhost/Simple/BankService");
    return ChannelFactory<IBank>.CreateChannel(new NetNamedPipeBinding(), address);
}
else
{
    EndpointAddress address = new EndpointAddress("http://localhost:8000/Simple/BankService");
    return ChannelFactory<IBank>.CreateChannel(new BasicHttpBinding(), address);
}

什么是特定的情况?我想了解它们是什么,因为你不是第一个提到它们的人。 - Yurii Hohan
当我们使用通道工厂时,性能上会有任何差异吗? - Thomas

4
如果您使用的是程序集共享(诚实地说,如果您拥有管道的两端,这是非常方便的),那么两端已经具有接口等的完整版本。运行svcutil工具(通过命令提示符或IDE)只是为了获取我们已经拥有的包装器似乎是多余的。当您想要只针对接口而不是包装类编写代码,并使用一些集中的代码来获取给定地址特定接口的通道时,它也非常有效。这实际上是我主要使用WCF的方式。
“客户端”方法适用于一次性服务,或者不需要通过任何中央工具进行处理。它也使得演示非常简单。

当您拥有管道的两端时,您是否会为接口创建单独的项目? - Yurii Hohan
@Hohhi 是的,我通常会将它放在一个库(dll)中。有时同一个程序既是客户端又是服务器,但这种情况非常罕见。 - Marc Gravell
在我看来,对于小型和中型项目而言,拥有两个项目以及一个用于托管和 DI 的项目似乎过于繁琐。 - Yurii Hohan
@Hohhi 我只提到了三个项目:客户端项目、服务器项目和 DTO/接口库。你几乎肯定有其中的两个,第三个也不是不合理的。 - Marc Gravell
当我们使用通道工厂时,是否会有性能方面的差异? - Thomas

2

在开发任何办公室插件或Visual Studio插件项目时,可能会遇到没有app.config文件的特定情况。

此外,在组织中,您希望标准化某些绑定和某些端点安全模式。您希望创建一个API,使开发人员可以轻松地使用它来创建代理,在这种情况下,您将使用channelfactory封装所有绑定信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接