Я бы сказал, что вы на правильном пути; -)
По сути, создание клиентского прокси WCF является двухэтапным процессом:
- создать фабрику каналов
- из фабрики каналов, создайте фактический канал
Шаг # 1 довольно «дорогой» с точки зрения времени и усилий, поэтому неплохо сделать это один раз, а затем кэшировать экземпляр ProjectWcfServiceFactory
где-нибудь в вашем коде.
Шаг № 2 на самом деле довольно легкий, и поскольку канал между клиентом и службой может перейти в «ошибочное состояние», когда на сервере возникает исключение (а затем его необходимо заново создать), кэширование реальный канал сам по себе менее желателен.
Таким образом, общепринятая лучшая практика будет:
создайте ChannelFactory<T>
(в вашем случае: ProjectWcfServiceFactory
) один раз и кэшируйте его как можно дольше; выполнять эту тяжелую работу только один раз
создайте фактический Channel
(здесь: IProjectWcfService
) по мере необходимости перед каждым вызовом. Таким образом, вам не нужно беспокоиться о проверке его состояния и воссоздании его по мере необходимости
ОБНОВЛЕНИЕ:"А как насчет закрытия канала?" спрашивает Берт ;-) Хороший вопрос !!
Приемлемая лучшая практика для этого заключается в том, чтобы заключить ваш сервисный вызов в блок try....catch....finally
. Сложность в том, что при утилизации канала тоже все может пойти не так, так что вы можете получить исключение - поэтому обернуть его в блок using(....)
недостаточно.
В общем, у вас есть:
IProjectWcfService client = ChannelFactory.CreateChannel();
try
{
client.MakeYourCall();
}
catch(CommunicationException ce)
{
// do any exception handling of your own
}
finally
{
ICommunicationObject comObj = ((ICommunicationObject)client);
if(comObj.State == CommunicationState.Faulted)
{
comObj.Abort();
}
else
{
comObj.Close();
}
}
И, конечно, вы могли бы определенно обернуть это в метод или метод расширения или что-то еще, чтобы не приходилось печатать это каждый раз, когда вы совершаете вызов службы.
ОБНОВЛЕНИЕ:
Книга, которую я всегда рекомендую, чтобы быстро приступить к работе в WCF: Изучение WCF Мишелем Леру Бустаманте. Она охватывает все необходимые темы и очень понятным и доступным способом. Это научит вас всему - основам, промежуточным темам, безопасности, управлению транзакциями и т. Д. - что вам необходимо знать, чтобы писать высококачественные и полезные службы WCF.
Обучение WCF http://ecx.images -amazon.com / images / I / 41wYa% 2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click, TopRight, 35, -76_AA240_SH20_OU01_.jpg
Более сложные темы и более глубокий взгляд на WCF будут освещены в Программирование служб WCF Ювала Лоуи. Он действительно углубляется во все технические детали и темы и представляет «библию» для программирования WCF.