2016-06-01 4 views
1

У меня есть настольное приложение, использующее службы WCF. У меня улучшилось удобство использования, когда я реализовал асинхронные вызовы WCF.Стратегия инициализации клиента клиента WCF

Мой вопрос: какова наилучшая практика для инициализации клиента обслуживания?

В предыдущей реализации существовал отдельный статический объект с учетными данными и общедоступный метод GetClient(), который создавал new ServiceClient перед каждым звонком. В приложении есть широко используется такая конструкция:

using (var svc = ServiceClientFactory.GetClient()) { 
    var data = svc.CallMethod(...); 
    some_application_context.specific_attribute = data; 
} 

так, перед любым вызовом, был создан новый клиент, который был уничтожен сразу после того, как операция была закончена, и получил использовали данные.

Мой вопрос: лучше ли вызывать клиентский конструктор перед каждым звонком?

Я попытался создать единый статический клиентский объект, который инициализируется один раз при запуске и один раз уничтожается при закрытии приложения, но у меня нет никакого заметного увеличения производительности.

Кажется, что все прекрасно работает, но мне интересно, есть ли какие-либо не очень очевидные препятствия при использовании одного клиента? А что рекомендуется?

ответ

0

Это своего рода широкий вопрос, он зависит от множества факторов, а также от стиля, который я предполагаю.

При использовании надежных сеансов или сеансов в целом вы должны, конечно, хранить ссылку. При вызове службы много раз лучше было бы сохранить ссылку, иначе она может не работать. Лучше профайл он тогда и там.

Я всегда храню ссылку и создаю свойство, которое проверяет, является ли клиент нулевым или в состоянии Faulted.

Service.ServiceClient ShippingService 
{ 
    get 
    { 
     if (mService == null || mService.State == CommunicationState.Faulted) 
     { 
     mService = new Service.ServiceClient("netTcpService"); 
     mShippingService.Open(); 
     } 

     return mService; 
    } 
} 
+0

'mService.State' - это были препятствия, я просил – obratim

0

Вы должны посмотреть на инъекцию зависимостей для получения ссылок на службы. Эффективно было бы похоже, если бы не та же производительность, что и сейчас, но это упростило бы долгосрочное управление и облегчило бы модульное тестирование.

Большая часть накладных расходов WCF - это переговоры о соединении, поэтому singleton vs new при каждом вызове не будет в конечном итоге иметь огромное значение.

Смежные вопросы