为什么IChannelFactory< TChannel>接口没有定义无参数CreateChannel()?
另一方面, 的概率ChannelFactory< TChannel>类具有无参数CreateChannel()。
出于可测试性/ SoC原因,我想传递IChannelFactory
界面,但这迫使我传递EndpointAddress
以便在CreateChannel(EndpointAddress)
中使用。
作为一种解决方法,我创建了一个IChannelFactory2< IChannel>
,其确实具有无参数CreateChannel()
。
但最终我只是好奇为什么它的设计是这样的(通常WCF有合理的设计选择,但我只是懒得独自完成这个!)
答案 0 :(得分:4)
ChannelFactory<T>.CreateChannel()方法只是一种辅助方法,可以通过ChannelFactory<T>类的实现细节实现。
如果查看ChannelFactory<T>源代码,您会看到:
public TChannel CreateChannel()
{
return this.CreateChannel(this.CreateEndpointAddress(this.Endpoint), (Uri) null);
}
CreateEndpointAddress
方法由内部由ChannelFactory类实现,ChannelFactory<T>继承自:{/ p>
internal EndpointAddress CreateEndpointAddress(ServiceEndpoint endpoint)
{
if (endpoint.Address == (EndpointAddress) null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError((Exception) new InvalidOperationException(System.ServiceModel.SR.GetString("SFxChannelFactoryEndpointAddressUri")));
else
return endpoint.Address;
}
如您所见,端点信息已通过ChannelFactory<T>.Endpoint属性提供,该属性通过the various constructors类的ChannelFactory<T>初始化。事实上,这些构造函数允许使用者指定要调用的端点的详细信息。
由于接口无法定义构造函数,因此传递所需信息的最合适方法是通过将要使用它的方法的参数,即CreateChannel方法。
答案 1 :(得分:1)
我遇到了同样的问题。
我的解决方案是使用工厂模式 -
public interface IFactory<out T>
{
T CreateInstance();
}
public class WCFChannelFactory<TService> : IFactory<TService>
{
public ChannelFactory<TService> ChannelFactory { get; set; }
public WCFChannelFactory(ChannelFactory<TService> channelFactory)
{
ChannelFactory = channelFactory;
}
public TService CreateInstance()
{
return ChannelFactory.CreateChannel();
}
}
然后在我的应用程序中,我只使用IFactory
。