ChannelFactory: создание и удаление - PullRequest
3 голосов
/ 06 ноября 2010

Я написал Sdk, который используется клиентом WPF и заботится о вызове служб WCF и кэшировании. Эти сервисы WCF вызываются с помощью ChannelFactory, поэтому у меня нет ссылок на сервисы. Для этого я создал фабрику, которая обрабатывает открытие и закрытие 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 Ответ

3 голосов
/ 06 ноября 2010

Спасибо, Даниэль, не видел этот пост.Поэтому я думаю, что следующий подход может быть хорошим подходом:

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();
    }       
}
...