creando WCF ChannelFactory <T>

Estoy tratando de convertir una aplicación existente .NET Remoting a WCF. Tanto el servidor como el cliente comparten una interfaz común y todos los objetos son objetos activados por el servidor.

En el mundo WCF, esto sería similar a crear un servicio por llamada y usarChannelFactory<T> para crear un proxy. Estoy luchando un poco con cómo crear correctamenteChannelFactory<T> para un cliente ASP.NET.

Por razones de rendimiento, quiero almacenar en cachéChannelFactory<T> objetos y simplemente crear un canal cada vez que llamo al servicio. En los días remotos de .NET, solía haberRemotingConfiguration.GetRegisteredWellknownClientTypes() método para obtener una colección de objetos de cliente que luego podría almacenar en caché. Parece que en el mundo WCF no existe tal cosa, aunque pude obtener una colección de puntos finales del archivo de configuración.

Ahora aquí está lo que creo que funcionará. Puedo crear algo como esto:

public static ProxyHelper
{
    static Dictionary<Type, object> lookup = new Dictionary<string, object>();  

    static public T GetChannel<T>()
    {
        Type type = typeof(T);
        ChannelFactory<T> factory;

        if (!lookup.ContainsKey(type))
        {
            factory = new ChannelFactory<T>();
            lookup.Add(type, factory);
        }
        else
        {
            factory = (ChannelFactory<T>)lookup[type];
        }

        T proxy = factory.CreateChannel();   
        ((IClientChannel)proxy).Open();

        return proxy;
    }    
}

Creo que el código anterior funcionará, pero estoy un poco preocupado por los múltiples hilos que intentan agregar nuevosChannelFactory<T> objetos si no está en la búsqueda. Como estoy usando .NET 4.0, estaba pensando en usarConcurrentDictionary y useGetOrAdd() método o usoTryGetValue() método primero para verificar siChannelFactory<T> existe y no existe, luego useGetOrAdd() método. Aunque no estoy seguro del rendimientoConcurrentDictionary.TryGetValue() yConcurrentDictionary.GetOrAdd() método.

Otra pregunta menor es si necesito llamarChannelFactory.Close() método en los objetos de fábrica de canales después de que finalice la aplicación ASP.NET o puedo dejar que .NET Framework elimine los objetos de fábrica de canales por sí mismo. El canal proxy siempre se cerrará después de llamar al método de servicio utilizando((IChannel)proxy).Close() método.

Respuestas a la pregunta(4)

Su respuesta a la pregunta