В нашей среде SharePoint/ASP.NET у нас есть серия классов ретривера данных, которые все вытекают из общего интерфейса. Мне была назначена задача создания ретривера данных, который мог удаленно общаться с другими фермами SharePoint с использованием WCF. Способ, которым я его реализовал в настоящий момент, - это singleton 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