为什么要使用ChannelFactory实例化WCF代理而不是服务引用?

本文关键字:服务 引用 代理 WCF ChannelFactory 实例化 为什么 | 更新日期: 2023-09-27 18:14:01

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

我遇到过对第二种选择持强烈意见的人,但我无法从他们那里理解一个清晰的论点

为什么要使用ChannelFactory实例化WCF代理而不是服务引用?

如果您正在使用程序集共享(这是,让我们面对它,非常方便,如果你拥有管道的两端),那么两端已经有一个完整的版本,如果接口等。运行svcutil工具(在命令提示符下或通过IDE)只是为了获得我们已经拥有的包装器,这似乎是多余的。当您只想对接口而不是包装器类进行编码时,它也可以很好地工作,并且使用一些集中的代码来获得通往给定地址的特定接口的通道。这实际上是我主要使用WCF的方式。

"客户端"方法适用于一次性服务,或者不需要通过任何中心工具的服务。它也使得演示非常简单。

第一个选项使用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);
}

在开发没有app.config文件的office插件或visual studio插件项目时,可能会出现这种情况。

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