私たちの SharePoint/ASP.NET 環境には、すべて共通のインターフェイスから派生した一連のデータ取得クラスがあります。私は、WCF を使用して他の SharePoint ファームとリモートで通信できるデータ リトリーバーを作成するタスクを割り当てられました。私が現在実装している方法は、シングルトンChannelFactory<T>
が静的コンストラクターで作成され、リモート データ リトリーバーの各インスタンスによって再利用されて、個々のプロキシ インスタンスが作成されるというものです。ChannelFactory
はアプリ ドメインで 1 回だけインスタンス化され、その作成はスレッド セーフであることが保証されているため、これはうまく機能すると考えました。私のコードは次のようになります。
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 が再起動されるたびにすべてのクリーンアップ作業が行われると想定できますか?