В нашей среде SharePoint / ASP.NET у нас есть ряд классов для извлечения данных, которые все происходят из общего интерфейса. Мне было поручено создать средство извлечения данных, которое могло бы удаленно взаимодействовать с другими фермами SharePoint с помощью WCF. В настоящий момент он реализован таким образом, что в статическом конструкторе создается синглтон ChannelFactory<T>
, который затем используется каждым экземпляром удаленного средства извлечения данных для создания отдельного экземпляра прокси. Я подумал, что это будет хорошо работать, потому что тогда экземпляр ChannelFactory
создается только один раз в домене приложения, и его создание гарантированно поточно-ориентированное . Мой код выглядит примерно так:
public class RemoteDataRetriever : IDataRetriever
{
protected static readonly ChannelFactory<IRemoteDataProvider>
RequestChannelFactory;
protected IRemoteDataProvider _channel;
static RemoteDataRetriever()
{
WSHttpBinding binding = new WSHttpBinding(
SecurityMode.TransportWithMessageCredential, true);
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.None;
binding.Security.Message.ClientCredentialType =
MessageCredentialType.Windows;
RequestChannelFactory =
new ChannelFactory<IRemoteDataProvider>(binding);
}
public RemoteDataRetriever(string endpointAddress)
{
_channel = RemoteDataRetriever.RequestChannelFactory.
CreateChannel(new EndpointAddress(endpointAddress));
}
}
У меня вопрос, это хороший дизайн? Я понял, что после создания ChannelFactory
мне не нужно беспокоиться о безопасности потоков, потому что я просто использую его для вызова CreateChannel()
, но я ошибаюсь? Меняет ли это состояние или делает что-то необычное за кулисами, что может вызвать проблемы с многопоточностью? Кроме того, мне нужно поместить куда-нибудь код (статический финализатор?), Который вручную удаляет ChannelFactory
, или я могу предположить, что всякий раз, когда IIS перезагружается, он выполняет всю работу по очистке для меня?
Похожие: Стратегии повторного использования ChannelFactory