为什么IChannelFactory <t>没有定义无参数的CreateChannel?</t>

时间:2011-08-21 07:42:34

标签: .net wcf

为什么IChannelFactory< TChannel>接口没有定义无参数CreateChannel()

另一方面, 的概率ChannelFactory< TChannel>类具有无参数CreateChannel()

出于可测试性/ SoC原因,我想传递IChannelFactory界面,但这迫使我传递EndpointAddress以便在CreateChannel(EndpointAddress)中使用。

作为一种解决方法,我创建了一个IChannelFactory2< IChannel>,其确实具有无参数CreateChannel()

但最终我只是好奇为什么它的设计是这样的(通常WCF有合理的设计选择,但我只是懒得独自完成这个!)

2 个答案:

答案 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