ChannelFactory:创建和处理

时间:2010-11-06 10:11:24

标签: wcf channelfactory

我编写了一个WPF客户端使用的Sdk,负责调用WCF服务和缓存。使用ChannelFactory调用这些WCF服务,因此我没有服务引用。为此,我创建了一个处理打开和关闭ChannelFactory和ClientChannel的工厂,如下所示:

public class ProjectStudioServiceFactory : IDisposable
{
    private IProjectStudioService _projectStudioService;
    private static ChannelFactory<IProjectStudioService> _channelFactory;

    public IProjectStudioService Instance
    {
        get
        {
            if (_channelFactory==null) _channelFactory = new ChannelFactory<IProjectStudioService>("ProjectStudioServiceEndPoint");
            _projectStudioService = _channelFactory.CreateChannel();
            ((IClientChannel)_projectStudioService).Open();                
            return _projectStudioService;
        }
    }

    public void Dispose()
    {
        ((IClientChannel)_projectStudioService).Close();
        _channelFactory.Close();
    }       
}

我称之为每个请求:

 using (var projectStudioService = new ProjectStudioServiceFactory())
        {
            return projectStudioService.Instance.FindAllCities(new FindAllCitiesRequest()).Cities;
        }

虽然这有效,但速度很慢,因为每次请求都会打开和关闭客户端通道和工厂。如果我保持开放,那就非常快。但我想知道最佳做法是什么?我应该保持开放吗?或不?如何以正确的方式处理这个问题?

1 个答案:

答案 0 :(得分:3)

谢谢丹尼尔,没看到那篇文章。所以我想以下可能是一个很好的方法:

public class ProjectStudioServiceFactory : IDisposable
{
    private static IProjectStudioService _projectStudioService;
    private static ChannelFactory<IProjectStudioService> _channelFactory;

    public IProjectStudioService Instance
    {
        get
        {
            if (_projectStudioService == null)
            {
                _channelFactory = new ChannelFactory<IProjectStudioService>("ProjectStudioServiceEndPoint");
                _projectStudioService = _channelFactory.CreateChannel();
               ((IClientChannel)_projectStudioService).Open(); 
            }                               
            return _projectStudioService;
        }
    }

    public void Dispose()
    {
        //((IClientChannel)_projectStudioService).Close();
        //_channelFactory.Close();
    }       
}