2010-07-05 23 views
7

Esto puede parecer un poco extraño, pero realmente necesito crear una solución para el dúplex muy complicado - manejo de comunicación en C#, especialmente para forzar a otros desarrolladores a observar el principio DRY.C#: ¿se usa el tipo de "auto" como parámetro genérico?

Así que lo que estoy haciendo es tener un tipo basado Multiton que tiene este aspecto:

internal sealed class SessionManager<T> where T : DuplexServiceBase 

que no es problema en absoluto - hasta ahora.

Sin embargo, tan pronto como yo quiero tener los servicios (voy con una instancia por sesión) registrarse en el SessionManager, comienza la molestia:

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action> 

(MessageDispatcherBase ser una de mis clases que crea un hilo y envía mensajes de forma asíncrona).

Quiero tener un método que tiene este aspecto:

protected void ProcessInboundMessage() 
    { 
     // Connect 
     SessionManager<self>.Current.Connect(this); 
    } 

... pero el problema es - ¿cómo podría llegar al "sí"?

NECESITO gerentes de sesión separados para cada clase de servicio, porque todos ellos tienen sus propias notificaciones (básicamente es el muy molesto método "NotifyAllClients" que hace que deseemos quitarnos el pelo durante las últimas horas) y necesitamos para ser tratado por separado.

¿Tienes CUALQUIER idea?

No quiero usar "AsyncPattern = true", por cierto ... esto me obligaría a renunciar a la seguridad de tipo, cumplimiento de contrato forzado (esto daría lugar a muy mal uso del sistema de comunicación que estoy configurando aquí arriba) y requeriría abandonar el principio DRY, habría un montón de códigos repetitivos por todos lados, y esto es algo que frunzo el ceño.

Editar:

He encontrado la mejor solución posible, gracias a las respuestas aquí - es un método de extensión, jeje ...

public static SessionManager<T> GetSessionManager<T>(this T sessionObject) 
     where T : DuplexServiceBase 
    { 
     return SessionManager<T>.Current; 
    } 

puedo usar esto como esto:

GetSessionManager().Connect(this); 

Misión cumplida. :-D

Este método (pertenece a DuplexServiceBase) me da el administrador de sesión con el que quiero trabajar. ¡Perfecto! :-)

Respuesta

15

me gustaría escribir un método de ayuda:

static class SessionManager { // non-generic! 
    static void Connect<T>(T item) where T : DuplexServiceBase { 
     SessionManager<T>.Current.Connect(item); 
    } 
} 

y uso SessionManager.Connect(this) que averiguarlo de forma automática a través de la inferencia de tipo genérico.

+0

usted es un genio, yo le daría 100, si pudiera por esa respuesta. ¡¡Gracias muuuuuucho !!Seguramente –

+0

'SessionManager .Current.Connect (elemento);'? –

+0

Hehe, tuve que reemplazar el "esto" por "elemento", por supuesto. :-) –

3

Se puede envolver la llamada en un método genérico, aprovechando de este modo la inferencia de tipos del compilador:

private static void ConnectSessionManager<T>(T service) 
{ 
    SessionManager<T>.Current.Connect(service) 
} 

protected void ProcessInboundMessage() 
{ 
    // Connect 
    ConnectSessionManager(this); 
} 
Cuestiones relacionadas