在我们的 SharePoint/ASP.NET 环境中,我们有一系列数据检索器类,它们都派生自一个通用接口。我被分配了创建一个数据检索器的任务,该检索器可以使用 WCF 与其他 SharePoint 场进行远程通信。我目前实现它的方式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 重新启动时,它都会为我完成所有清理工作?