Я написал 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;
}
Хотя это работает, это медленно, потому что для каждого запроса клиентский канал и фабрика открываются и закрываются. Если я буду держать его открытым, это очень быстро. Но мне было интересно, какой будет лучшая практика? Должен ли я держать его открытым? Или нет? Как правильно с этим справиться?